Basic Setup

── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.2     ✓ purrr   0.3.4
✓ tibble  3.0.3     ✓ dplyr   1.0.2
✓ tidyr   1.1.2     ✓ stringr 1.4.0
✓ readr   1.3.1     ✓ forcats 0.5.0
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
Loading required package: lattice
Loading required package: ggformula
Loading required package: ggstance

Attaching package: 'ggstance'
The following objects are masked from 'package:ggplot2':

    geom_errorbarh, GeomErrorbarh

New to ggformula?  Try the tutorials: 
    learnr::run_tutorial("introduction", package = "ggformula")
    learnr::run_tutorial("refining", package = "ggformula")
Loading required package: mosaicData
Loading required package: Matrix

Attaching package: 'Matrix'
The following objects are masked from 'package:tidyr':

    expand, pack, unpack
Registered S3 method overwritten by 'mosaic':
  method                           from   
  fortify.SpatialPolygonsDataFrame ggplot2

The 'mosaic' package masks several functions from core packages in order to add 
additional features.  The original behavior of these functions should not be affected by this.

Note: If you use the Matrix package, be sure to load it BEFORE loading mosaic.

Have you tried the ggformula package for your plots?

Attaching package: 'mosaic'
The following object is masked from 'package:Matrix':

    mean
The following objects are masked from 'package:dplyr':

    count, do, tally
The following object is masked from 'package:purrr':

    cross
The following object is masked from 'package:ggplot2':

    stat
The following objects are masked from 'package:stats':

    binom.test, cor, cor.test, cov, fivenum, IQR, median, prop.test,
    quantile, sd, t.test, var
The following objects are masked from 'package:base':

    max, mean, min, prod, range, sample, sum

Attaching package: 'scales'
The following object is masked from 'package:mosaic':

    rescale
The following object is masked from 'package:purrr':

    discard
The following object is masked from 'package:readr':

    col_factor
Loading required package: knitr

Import Colors

Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  change = col_double(),
  responses = col_double(),
  time = col_double(),
  prev_condition = col_double(),
  prev_change = col_double(),
  color = col_double()
)
`summarise()` regrouping output by 'subject', 'age' (override with `.groups` argument)

Import Objects

Warning in rm(objectList): object 'objectList' not found
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Duplicated column names deduplicated: 'time' => 'time_1' [9]
Parsed with column specification:
cols(
  `#subject` = col_double(),
  block = col_double(),
  trial = col_double(),
  condition = col_double(),
  setsize = col_double(),
  change = col_double(),
  time = col_double(),
  responses = col_double(),
  time_1 = col_double(),
  Pic = col_character(),
  prev_condition = col_double(),
  prev_setsize = col_double(),
  prev_change = col_double(),
  prev_time = col_double()
)
Warning: Problem with `mutate()` input `pic_num`.
ℹ NAs introduced by coercion
ℹ Input `pic_num` is `as.numeric(Pic)`.
Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
`summarise()` regrouping output by 'subject', 'age' (override with `.groups` argument)
`summarise()` regrouping output by 'subject', 'age', 'setsize' (override with `.groups` argument)
`summarise()` regrouping output by 'subject' (override with `.groups` argument)
`summarise()` ungrouping output (override with `.groups` argument)
`summarise()` ungrouping output (override with `.groups` argument)
`summarise()` ungrouping output (override with `.groups` argument)

join color & objects

colorListResult %>%ungroup() %>%  select(age,condition,mean_answer_correct,mean_response_time,kPashler,k,joinKey) -> ColorJoin
names(ColorJoin) <- c("age_c","condition_c","mean_answer_correct_c","mean_response_time_c","kPashler_c","k_c","joinKey") 
objectResult %>% inner_join(ColorJoin,by = "joinKey")  %>% 
  mutate(diffAnswerRate = mean_answer_correct-mean_answer_correct_c)%>% 
  mutate(diffK = k-k_c)-> testsJoined
objectResultCondition %>% inner_join(ColorJoin,by = "joinKey") -> testConditionJoined
colorListResult %>% ungroup() %>% select(subject,age,condition,mean_answer_correct,mean_response_time,kPashler,k) %>% mutate(test="color") %>% rename(setsize = condition) -> ColorJoinLong
objectResult %>%  ungroup() %>% select(subject,age,setsize,mean_answer_correct,mean_response_time,kPashler,k) %>% mutate(test="object") -> ObjectJoinLong
joinedTestList = rbind(ObjectJoinLong,ColorJoinLong)

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Erster Schritt Überblick der Gesamtanzahl der falschen und richtigen Antworten

Warning: `count_()` is deprecated as of dplyr 0.7.0.
Please use `count()` instead.
See vignette('programming') for more help
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

Gib eine Tabelle mit den zusammenfassenden Daten für Color & Objects aus

colorList %>% group_by(condition,age) %>% summarise(Gesamt = n(),Richtig = sum(answer_correct == 1),Falsch = sum(answer_correct == 0), ProzentRichtig = scales::percent(round(mean(answer_correct == 1),2)),ProzentFalsch = scales::percent(round(mean(answer_correct == 0),2))) %>% rename(SetSize = condition) %>% kable(caption = "Überblick Versuchsreihe Color",align = "llcccrr")
`summarise()` regrouping output by 'condition' (override with `.groups` argument)
Überblick Versuchsreihe Color
SetSize age Gesamt Richtig Falsch ProzentRichtig ProzentFalsch
2 old 1297 1226 71 95% 5%
2 young 1298 1268 30 98% 2%
4 old 1297 945 352 73% 27%
4 young 1303 1139 164 87% 13%
6 old 1291 863 428 67% 33%
6 young 1295 946 349 73% 27%
8 old 1315 782 533 59% 41%
8 young 1304 838 466 64% 36%
objectList %>% group_by(setsize,age) %>% summarise(Gesamt = n(),Richtig = sum(answer_correct == 1),Falsch = sum(answer_correct == 0), ProzentRichtig = scales::percent(round(mean(answer_correct == 1),2)),ProzentFalsch = scales::percent(round(mean(answer_correct == 0),2))) %>% kable(caption = "Überblick Versuchsreihe Real world objects",align = "llcccrr")
`summarise()` regrouping output by 'setsize' (override with `.groups` argument)
Überblick Versuchsreihe Real world objects
setsize age Gesamt Richtig Falsch ProzentRichtig ProzentFalsch
2 old 3840 3539 301 92% 8%
2 young 3840 3607 233 94% 6%
4 old 3840 3066 774 80% 20%
4 young 3840 3249 591 85% 15%
6 old 3840 2678 1162 70% 30%
6 young 3840 2911 929 76% 24%
#colorListResult %>% ungroup() %>% group_by(age,condition) %>% summarise(mean(hitRate),mean(falseAlarmRate),mean(k),mean(kPashler))%>% kable(caption = "Überblick Versuchsreihe Color objects K",align = "llcccrr")

Plotte einen Überblick der Gesamtmenge

colorList %>% mutate(age=factor(age, levels = c("young","old")),
             answer_correct=factor(answer_correct, levels = c(0,1),labels = c("False","Correct"))) %>%
  group_by(age,condition,answer_correct) %>% summarise(N=n()) %>% ungroup() %>%
  group_by(age,condition) %>% 
  mutate(Total=sum(N),Percent=N/Total,
         Lab=paste0(N,' (',paste0(round(100*Percent,0),'%'),')')) -> SumsColors
`summarise()` regrouping output by 'age', 'condition' (override with `.groups` argument)
#Plot
ggplot(SumsColors,aes(x=age,y=N,fill=answer_correct))+
  geom_bar(stat='identity',position = position_stack())+
  facet_wrap(.~condition,scales = 'free')+
  geom_text(aes(label=Lab),position = position_stack(vjust = .5),size=3)+
  geom_text(aes(y=Total,label=Total),vjust=-0.25,size=3)+
  labs(title="Colors",subtitle = "per setsize grouped by age", x="age", y="# answer correct", fill="Answer")+scale_fill_brewer(palette = "Pastel1")+
  ylim(0, 1400)

objectList %>% mutate(age=factor(age, levels = c("young","old")),
             answer_correct=factor(answer_correct, levels = c(0,1),labels = c("False","Correct"))) %>%
  group_by(age,setsize,answer_correct) %>% summarise(N=n()) %>% ungroup() %>%
  group_by(age,setsize) %>% 
  mutate(Total=sum(N),Percent=N/Total,
         Lab=paste0(N,' (',paste0(round(100*Percent,0),'%'),')')) -> SumsObjects
`summarise()` regrouping output by 'age', 'setsize' (override with `.groups` argument)
#Plot
ggplot(SumsObjects,aes(x=age,y=N,fill=answer_correct))+
  geom_bar(stat='identity',position = position_stack())+
  facet_wrap(.~setsize,scales = 'free')+
  geom_text(aes(label=Lab),position = position_stack(vjust = .5),size=3)+
  geom_text(aes(y=Total,label=Total),vjust=-0.25,size=3)+
  labs(title="Real world objects",subtitle = "per setsize grouped by age", x="age", y="# answer correct", fill="Answer")+scale_fill_brewer(palette = "Pastel1")

Plotte die Streuung von Colors und real objects

colorListResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age)) + geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+scale_y_continuous(labels = scales::percent)+labs(title="Colors",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age)) + geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+scale_y_continuous(labels = scales::percent)+labs(title="Real world objects",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

colorListResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age))+ geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~condition,scales = 'free')+scale_y_continuous(labels = scales::percent)+labs(title="Colors",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age))+ geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~setsize,scales = 'free')+scale_y_continuous(labels = scales::percent)+labs(title="Real world objects",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

colorListResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age)) + geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+scale_y_continuous(labels = scales::percent)+labs(title="Colors",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age)) + geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+scale_y_continuous(labels = scales::percent)+labs(title="Real world objects",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

colorListResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age))+ geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~condition,scales = 'free')+scale_y_continuous(labels = scales::percent)+labs(title="Colors",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=mean_answer_correct,fill=age))+ geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~setsize,scales = 'free')+scale_y_continuous(labels = scales::percent)+labs(title="Real world objects",subtitle = "distribution test persons mean value of correct answers", x="age", y="mean answers correct", fill="Answer")

Häufigkeitsverteilung

colorListResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_histogram(bins = 20)+labs(title="Colors",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")+scale_x_continuous(labels = scales::percent)

colorListResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_histogram(bins=20)+facet_wrap(.~condition,scales = 'free')+scale_x_continuous(labels = scales::percent)+labs(title="Colors",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")

objectResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_histogram(bins=20)+labs(title="Real world objects",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")+scale_x_continuous(labels = scales::percent)

objectResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_histogram(bins=20)+facet_wrap(.~setsize,scales = 'free')+scale_x_continuous(labels = scales::percent)+labs(title="Real world objects",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")

colorListResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_density (alpha=0.2)+labs(title="Colors",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")+scale_x_continuous(labels = scales::percent)

colorListResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_density( alpha=0.2)+facet_wrap(.~condition,scales = 'free')+scale_x_continuous(labels = scales::percent)+labs(title="Colors",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")

objectResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_density(alpha=0.2)+labs(title="Real world objects",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")+scale_x_continuous(labels = scales::percent)

objectResult %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=age))+ geom_density(alpha=0.2)+facet_wrap(.~setsize,scales = 'free')+scale_x_continuous(labels = scales::percent)+labs(title="Real world objects",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")

Vergleich Color vs. Objects gleiche Altersgruppen

joinedTestList %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=test))+ geom_density (alpha=0.2)+labs(title="Colors vs Object",subtitle = "Häufigkeiten korrekter Antworten", x="Mean answers correct")+scale_x_continuous(labels = scales::percent)

joinedTestList %>%  ggplot(mapping=aes(x=mean_answer_correct, fill=test))+ geom_density (alpha=0.2)+facet_wrap(.~setsize,scales = 'free')+labs(title="Colors vs Object",subtitle = "Häufigkeiten korrekter Antworten per Set Größe", x="Mean answers correct")+scale_x_continuous(labels = scales::percent)

Korrelation

colorListResult %>% ggplot(aes(x=mean_answer_correct, y=mean_response_time,color = age))+geom_point()+geom_smooth(method = lm, se = FALSE)
`geom_smooth()` using formula 'y ~ x'

colorListResult %>% ggplot(aes(x=mean_answer_correct, y=mean_response_time,color = age))+geom_point()+geom_smooth(method = "loess", span = 0.15, method.args = list(degree=1))
`geom_smooth()` using formula 'y ~ x'

colorListResult %>% ggplot(aes(x=mean_answer_correct, y=mean_response_time,color = age))+geom_point()+geom_smooth(method = lm, se = FALSE)+facet_wrap(.~condition,scales = 'free')
`geom_smooth()` using formula 'y ~ x'

objectResult %>% ggplot(aes(x=mean_answer_correct, y=mean_response_time,color = age))+geom_point()+geom_smooth(method = lm, se = FALSE)
`geom_smooth()` using formula 'y ~ x'

objectResult %>% ggplot(aes(x=mean_answer_correct, y=mean_response_time,color = age))+geom_point()+geom_smooth(method = lm, se = FALSE)+facet_wrap(.~setsize,scales = 'free')
`geom_smooth()` using formula 'y ~ x'

objectResult %>% filter(age==“young”,setsize==6) %>% ungroup %>% select(mean_answer_correct) -> testIt shapiro.test(testIt$mean_answer_correct)

Normalverteilung:

colorListResult %>% filter(condition==2,age=="old") -> df_means_o2
fromTo <- round(range(df_means_o2$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_o2$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Old, Setsize 2")
rug(jitter(df_means_o2$mean_answer_correct))
curve(dnorm(x,mean(df_means_o2$mean_answer_correct),sd(df_means_o2$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==4,age=="old") -> df_means_o4
fromTo <- round(range(df_means_o4$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_o4$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Old, Setsize 4")
rug(jitter(df_means_o4$mean_answer_correct))
curve(dnorm(x,mean(df_means_o4$mean_answer_correct),sd(df_means_o4$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==6,age=="old") -> df_means_o6
fromTo <- round(range(df_means_o6$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_o6$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Old, Setsize 6")
rug(jitter(df_means_o6$mean_answer_correct))
curve(dnorm(x,mean(df_means_o6$mean_answer_correct),sd(df_means_o6$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==8,age=="old") -> df_means_o8
fromTo <- round(range(df_means_o8$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_o8$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Old, Setsize 8")
rug(jitter(df_means_o8$mean_answer_correct))
curve(dnorm(x,mean(df_means_o8$mean_answer_correct),sd(df_means_o8$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==2,age=="young") -> df_means_y2
fromTo <- round(range(df_means_y2$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_y2$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Young, Setsize 2")
rug(jitter(df_means_y2$mean_answer_correct))
curve(dnorm(x,mean(df_means_y2$mean_answer_correct),sd(df_means_y2$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==4,age=="young") -> df_means_y4
fromTo <- round(range(df_means_y4$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_y4$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Young, Setsize 4")
rug(jitter(df_means_y4$mean_answer_correct))
curve(dnorm(x,mean(df_means_y4$mean_answer_correct),sd(df_means_y4$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==6,age=="young") -> df_means_y6
fromTo <- round(range(df_means_y6$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_y6$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Young, Setsize 6")
rug(jitter(df_means_y6$mean_answer_correct))
curve(dnorm(x,mean(df_means_y6$mean_answer_correct),sd(df_means_y6$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

colorListResult %>% filter(condition==8,age=="young") -> df_means_y8
fromTo <- round(range(df_means_o8$mean_answer_correct),2)+c(-0.08,0.08)
limits <- seq(from=fromTo[1], to=fromTo[2], by=0.02)
hist(df_means_y8$mean_answer_correct,freq=FALSE,xlim = fromTo ,xlab = "Mittelwert korrekte Antworten",ylab = "relative Häufigkeit",breaks=limits,main = "Histogramm & Normalverteilung für Young, Setsize 8")
rug(jitter(df_means_y8$mean_answer_correct))
curve(dnorm(x,mean(df_means_y8$mean_answer_correct),sd(df_means_y8$mean_answer_correct)),lwd=2,col="blue",add=TRUE)

K Wert

# Color List
colorListResult %>% ungroup() %>% group_by(age,condition) %>%summarise(round(mean(hitRate),2),round(sd(hitRate),2),round(mean(falseAlarmRate),2),round(sd(falseAlarmRate),2),round(mean(k),2),round(sd(k),2),round(mean(kPashler),2),round(sd(kPashler),2)) ->df_KStat_data
`summarise()` regrouping output by 'age' (override with `.groups` argument)
names(df_KStat_data) <- c("age","setsize","mean_hit_rate","sd_hit_rate","mean_false_alarm","sd_false_alarm","mean_k","sd_k","mean_kPashler","sd_kPashler")
colorListResult %>% ungroup() %>% group_by(age,condition) %>%summarise(paste(round(mean(hitRate),2),"/",round(sd(hitRate),2)),paste(round(mean(falseAlarmRate),2),"/",round(sd(falseAlarmRate),2)),paste(round(mean(k),2),"/",round(sd(k),2)),paste(round(mean(kPashler),2),"/",round(sd(kPashler),2))) ->df_KStat
`summarise()` regrouping output by 'age' (override with `.groups` argument)
names(df_KStat) <- c("age","Set Size","HitRate Mean/SD","False Alarm Mean/SD","k Mean (SD)","kPashler MEAN/SD")
df_KStat %>% kable(caption = "Überblick Versuchsreihe Color objects K",align = "lcccccr")
Überblick Versuchsreihe Color objects K
age Set Size HitRate Mean/SD False Alarm Mean/SD k Mean (SD) kPashler MEAN/SD
old 2 0.95 / 0.05 0.06 / 0.05 1.78 / 0.15 1.88 / 0.11
old 4 0.82 / 0.11 0.37 / 0.17 1.83 / 0.69 2.85 / 0.78
old 6 0.8 / 0.16 0.47 / 0.2 2.02 / 0.71 4.09 / 1.28
old 8 0.77 / 0.16 0.58 / 0.18 1.51 / 0.82 3.77 / 2.19
young 2 0.99 / 0.02 0.03 / 0.03 1.91 / 0.07 1.97 / 0.04
young 4 0.95 / 0.03 0.21 / 0.11 2.99 / 0.43 3.77 / 0.17
young 6 0.89 / 0.07 0.43 / 0.16 2.76 / 1 4.72 / 0.9
young 8 0.87 / 0.07 0.58 / 0.12 2.27 / 0.72 5.52 / 0.98
# Object List
objectResult %>% ungroup() %>% group_by(age,setsize) %>%summarise(round(mean(hitRate),2),round(sd(hitRate),2),round(mean(falseAlarmRate),2),round(sd(falseAlarmRate),2),round(mean(k),2),round(sd(k),2),round(mean(kPashler),2),round(sd(kPashler),2)) ->df_O_KStat_data
`summarise()` regrouping output by 'age' (override with `.groups` argument)
names(df_O_KStat_data) <- c("age","setsize","mean_hit_rate","sd_hit_rate","mean_false_alarm","sd_false_alarm","mean_k","sd_k","mean_kPashler","sd_kPashler")
objectResult %>% ungroup() %>% group_by(age,setsize) %>%summarise(paste(round(mean(hitRate),2),"/",round(sd(hitRate),2)),paste(round(mean(falseAlarmRate),2),"/",round(sd(falseAlarmRate),2)),paste(round(mean(k),2),"/",round(sd(k),2)),paste(round(mean(kPashler),2),"/",round(sd(kPashler),2))) ->df_O_KStat
`summarise()` regrouping output by 'age' (override with `.groups` argument)
names(df_O_KStat) <- c("age","Set Size","HitRate Mean/SD","False Alarm Mean/SD","k Mean (SD)","kPashler MEAN/SD")
df_O_KStat %>% kable(caption = "Überblick Versuchsreihe Real World Objects K",align = "lcccccr")
Überblick Versuchsreihe Real World Objects K
age Set Size HitRate Mean/SD False Alarm Mean/SD k Mean (SD) kPashler MEAN/SD
old 2 0.87 / 0.07 0.03 / 0.03 1.69 / 0.13 1.74 / 0.13
old 4 0.77 / 0.07 0.17 / 0.07 2.39 / 0.27 2.89 / 0.31
old 6 0.75 / 0.12 0.36 / 0.13 2.37 / 0.46 3.76 / 0.85
young 2 0.92 / 0.04 0.04 / 0.03 1.76 / 0.1 1.82 / 0.09
young 4 0.83 / 0.05 0.14 / 0.07 2.77 / 0.31 3.22 / 0.22
young 6 0.82 / 0.07 0.3 / 0.1 3.1 / 0.5 4.47 / 0.52
#colorListResult %>% ungroup %>% group_by(age,condition) %>% summarise(round(max(k),2)) %>% kable(caption = "Überblick Versuchsreihe Colors k Wert",align = "lcr")
#colorListResult %>% ungroup %>% group_by(age,condition) %>% summarise(round(max(kPashler),2)) %>% kable(caption = "Überblick Versuchsreihe Colors kPashler Wert",align = "lcr")
#objectResult %>% ungroup %>% group_by(age,setsize) %>% summarise(round(max(k),2)) %>% kable(caption = "Überblick Versuchsreihe Real world objects k Wert",align = "lcr")
#objectResult %>% ungroup %>% group_by(age,setsize) %>% summarise(round(max(kPashler),2)) %>% kable(caption = "Überblick Versuchsreihe Real world objects kPashler Wert",align = "lcr")

ggplot(df_KStat_data, aes(x=factor(setsize), y=mean_k, fill=factor(age))) + geom_bar(position=position_dodge(), stat="identity",colour="black",size=.3) +geom_errorbar(aes(ymin=mean_k-sd_k, ymax=mean_k+sd_k),size=.3,width=.2,position=position_dodge(.9))+xlab("Set Size") +ylab("Mean (k)") + scale_fill_hue(name="Age Group") + ggtitle("Color Test K value results per set size")

ggplot(df_O_KStat_data, aes(x=factor(setsize), y=mean_k, fill=factor(age))) + geom_bar(position=position_dodge(), stat="identity",colour="black",size=.3) +geom_errorbar(aes(ymin=mean_k-sd_k, ymax=mean_k+sd_k),size=.3,width=.2,position=position_dodge(.9))+xlab("Set Size") +ylab("Mean (k)") + scale_fill_hue(name="Age Group") + ggtitle("Real World Objects Test K value results per set size")

ggplot(df_KStat_data, aes(x=factor(setsize), y=mean_kPashler, fill=factor(age))) + geom_bar(position=position_dodge(), stat="identity",colour="black",size=.3) +geom_errorbar(aes(ymin=mean_kPashler-sd_kPashler, ymax=mean_kPashler+sd_kPashler),size=.3,width=.2,position=position_dodge(.9))+xlab("Set Size") +ylab("Mean (k-Pashler)") + scale_fill_hue(name="Age Group") + ggtitle("Color Test k-Pashler value results per set size")

ggplot(df_O_KStat_data, aes(x=factor(setsize), y=mean_kPashler, fill=factor(age))) + geom_bar(position=position_dodge(), stat="identity",colour="black",size=.3) +geom_errorbar(aes(ymin=mean_kPashler-sd_kPashler, ymax=mean_kPashler+sd_kPashler),size=.3,width=.2,position=position_dodge(.9))+xlab("Set Size") +ylab("Mean (k-Pashler)") + scale_fill_hue(name="Age Group") + ggtitle("Real World Objects Test k-Pashler value results per set size")

Grafiken Für K-Werte

colorListResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age)) + geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+labs(title="Colors",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age)) + geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+labs(title="Real world objects",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

colorListResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age))+ geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~condition,scales = 'free')+labs(title="Colors",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age))+ geom_violin() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~setsize,scales = 'free')+labs(title="Real world objects",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

colorListResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age)) + geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+labs(title="Colors",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age)) + geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+labs(title="Real world objects",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

colorListResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age))+ geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~condition,scales = 'free')+labs(title="Colors",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

objectResult %>%  ggplot(mapping=aes(x=age, y=k,fill=age))+ geom_boxplot() + geom_jitter(width = 0.2, alpha = 0.6)+facet_wrap(.~setsize,scales = 'free')+labs(title="Real world objects",subtitle = "distribution test persons mean value of k", x="age", y="mean k", fill="Answer")

####### K Barcharts ##########
mkChart <- ggplot(colorListResult, aes(x = condition,y = k, col = factor(age), fill = factor(age)))

Unterschied zwischen Colors & Objekte H1: Änderungen von Real World Objekten werden von jungen Personen besser erkannt als Änderungen von Farben. H1: Änderungen von Real World Objekten werden von alten Personen besser erkannt als Änderungen von Farben. Notwendige Auswertungen: T-Test abhängige Stichprobe je alt und jung

Voraussetzungen:

Abhängige Variable ist intervallskaliert - ok Es liegen zwei verbundene Stichproben vor aber die Meßwertpaare sind unabhängig - ok Die Unterschiede zwischen den verbundenen Testwerten sind in der Grundgesamtheit normalverteilt.

colorList %>% filter(condition <= 6) %>% summarise(mean(answer_correct)) -> df_mean_color_all
LS0tCnRpdGxlOiAiQ29sb3JzIHZzIFJlYWwtV29ybGQgT2JqZWN0cyIKb3V0cHV0OgogIyBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgJyc6IGRlZmF1bHQKLS0tCkJhc2ljIFNldHVwCmBgYHtyIGVjaG89RkFMU0V9CmlmIChleGlzdHMoImNvbG9yTGlzdCIpKSB7CiAgcm0oY29sb3JMaXN0KQp9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxzcikKbGlicmFyeShyZWFkcikKbGlicmFyeShtb3NhaWMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzY2FsZXMpCnJlcXVpcmUoa25pdHIpCnNldHdkKCIvaG9tZS9saW5hL0N2c1JXTy8iKQpgYGAKSW1wb3J0IENvbG9ycwpgYGB7ciBlY2hvID1GQUxTRX0KCmRhdGVpTmFtZW4gPC0gZGlyKHBhdGg9Ii4vQ29sb3JzIixwYXR0ZXJuPSJjb2xvcnNfLi4uLnR4dCIpCmZvciAoZGF0ZWkgaW4gZGF0ZWlOYW1lbikgewogIGVpbmdhYmVEYXRlaSA8LSBwYXN0ZSgiLi9Db2xvcnMvIixkYXRlaSxzZXA9IiIpCiAgY29sb3JfdGVtcCA8LSByZWFkX2RlbGltKGVpbmdhYmVEYXRlaSwiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKQogIGlmIChleGlzdHMoImNvbG9yTGlzdCIpKSB7CiAgICBjb2xvckxpc3QgPC0gcmJpbmQoY29sb3JMaXN0LGNvbG9yX3RlbXApCiAgfSBlbHNlIHsKICAgIGNvbG9yTGlzdCA8LSBjb2xvcl90ZW1wCiAgfQp9CmNvbG5hbWVzKGNvbG9yTGlzdClbMV0gPC0gInN1YmplY3QiCnJtIChjb2xvcl90ZW1wKQpybSAoZGF0ZWkpCnJtIChkYXRlaU5hbWVuKQpybSAoZWluZ2FiZURhdGVpKQojIyBAa25pdHIgYWRkQ29sdW1ucwpjb2xvckxpc3QgPC0gY29sb3JMaXN0ICU+JSBtdXRhdGUoYW5zd2VyX2NoYW5nZSA9ICgoKHJlc3BvbnNlcy0yMDApJSUxMCkpJS8lMikKY29sb3JMaXN0IDwtIGNvbG9yTGlzdCAlPiUgbXV0YXRlKGFuc3dlcl9jb3JyZWN0ID0gaWZfZWxzZShyZXNwb25zZXMtMjAwIDwgMTAsMSwwKSkKY29sb3JMaXN0IDwtIGNvbG9yTGlzdCAlPiUgbXV0YXRlKHNpZ25hbF9kZXRlY3Rpb24gPSAyKmNoYW5nZSArIGFuc3dlcl9jb3JyZWN0KQpjb2xvckxpc3QgPC0gY29sb3JMaXN0ICU+JSBtdXRhdGUoYWdlID0gaWZfZWxzZShzdWJqZWN0LTEwMCA+IDEwMCwib2xkIiwieW91bmciKSkKY29sb3JMaXN0ICU+JSAKICBtdXRhdGUoY29sb3JfdGV4dCA9IGNhcjo6cmVjb2RlKC4kY29sb3IsICIxID0gJ3JvdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0gJ2dyw7xuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSAnYmxhdSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gJ2dlbGInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9ICdwaW5rJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgPSAnc2Nod2Fyeic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ID0gJ29yYW5nZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ID0gJ3TDvHJraXMnIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3IgPSBUUlVFKSkgLT4gY29sb3JMaXN0CmNvbG9yTGlzdCAlPiUgCiAgbXV0YXRlKHNpZ25hbF9kZXRlY3Rpb25fdGV4dCA9IGNhcjo6cmVjb2RlKC4kc2lnbmFsX2RldGVjdGlvbiwgIjAgPSAnZmFsc2UgYWxhcm0nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gJ2NvcnJlY3QgcmVqZWN0aW9uJzsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSAnbWlzcyc7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gJ2hpdCciKSkgLT4gY29sb3JMaXN0CiMjIEBrbml0ciBjcmVhdGUgY29sb3JSZXN1bHQKY29sb3JHcm91cCA8LSBncm91cF9ieShjb2xvckxpc3QsIHN1YmplY3QsYWdlICxjb25kaXRpb24pCnN1bW1hcml6ZShjb2xvckdyb3VwLAogICAgICAgICAgdG90YWxDYXNlcyA9IG4oKSwgCiAgICAgICAgICBjb3JyZWN0X2Fuc3dlciA9IHN1bShhbnN3ZXJfY29ycmVjdCA9PSAxKSAsCiAgICAgICAgICBtZWFuX2Fuc3dlcl9jb3JyZWN0ID0gbWVhbihhbnN3ZXJfY29ycmVjdCksIAogICAgICAgICAgbWVhbl9yZXNwb25zZV90aW1lID0gbWVhbih0aW1lKSwKICAgICAgICAgIG1lZGlhbl9yZXNwb25zZV90aW1lID0gbWVkaWFuKHRpbWUpLAogICAgICAgICAgZmFsc2VBbGFybSA9IHN1bShzaWduYWxfZGV0ZWN0aW9uID09IDApLAogICAgICAgICAgY29ycmVjdF9yZWplY3Rpb24gPSBzdW0oc2lnbmFsX2RldGVjdGlvbiA9PSAxKSwgCiAgICAgICAgICBtaXNzID0gc3VtKHNpZ25hbF9kZXRlY3Rpb24gPT0gMiksIAogICAgICAgICAgaGl0ID0gc3VtKHNpZ25hbF9kZXRlY3Rpb24gPT0gMykpICU+JSAKICAgICAgICAgICAgbXV0YXRlIChub0NoYW5nZVRvdGFsID0gZmFsc2VBbGFybStjb3JyZWN0X3JlamVjdGlvbikgJT4lIAogICAgICAgICAgICBtdXRhdGUoY2hhbmdlVG90YWwgPSBtaXNzK2hpdCkgJT4lIAogICAgICAgICAgICBtdXRhdGUoZmFsc2VBbGFybVJhdGUgPSBmYWxzZUFsYXJtIC8gbm9DaGFuZ2VUb3RhbCkgJT4lIAogICAgICAgICAgICBtdXRhdGUoaGl0UmF0ZSA9IGhpdCAvIGNoYW5nZVRvdGFsKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShrUGFzaGxlciA9IGNvbmRpdGlvbiooaGl0UmF0ZS1mYWxzZUFsYXJtUmF0ZSkvKDEtZmFsc2VBbGFybVJhdGUpKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShrID0gY29uZGl0aW9uKihoaXRSYXRlIC0gZmFsc2VBbGFybVJhdGUpKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShqb2luS2V5ID0gcGFzdGUwKHN1YmplY3QsY29uZGl0aW9uKSkgLT4gY29sb3JMaXN0UmVzdWx0CmBgYAoKSW1wb3J0IE9iamVjdHMKCmBgYHtyIGVjaG89RkFMU0V9CnJtKG9iamVjdExpc3QpICMgQXVmcsOkdW1lbiB2b24gYWx0ZW4gRGF0ZW4KIyBDcmVhdGUgdGhlIG1vZGUgZnVuY3Rpb24uCmdldG1vZGUgPC0gZnVuY3Rpb24odikgewogIHVuaXF2IDwtIHVuaXF1ZSh2KQogIHVuaXF2W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh2LCB1bmlxdikpKV0KfQpkYXRlaU5hbWVuIDwtIGRpcihwYXRoPSIuL09iamVjdHMiLHBhdHRlcm49Im9iamVjdF8uLi4udHh0IikKZm9yIChkYXRlaSBpbiBkYXRlaU5hbWVuKSB7CiAgZWluZ2FiZURhdGVpIDwtIHBhc3RlKCIuL09iamVjdHMvIixkYXRlaSxzZXA9IiIpCiAgb2JqZWN0X3RlbXAgPC0gcmVhZF9kZWxpbShlaW5nYWJlRGF0ZWksIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkKICBpZiAoZXhpc3RzKCJvYmplY3RMaXN0IikpIHsKICAgIG9iamVjdExpc3QgPC0gcmJpbmQob2JqZWN0TGlzdCxvYmplY3RfdGVtcCkKICB9IGVsc2UgewogICAgb2JqZWN0TGlzdCA8LSBvYmplY3RfdGVtcAogIH0KfQpjb2xuYW1lcyhvYmplY3RMaXN0KVsxXSA8LSAic3ViamVjdCIKcm0gKG9iamVjdF90ZW1wKQpybSAoZGF0ZWkpCnJtIChkYXRlaU5hbWVuKQpybSAoZWluZ2FiZURhdGVpKQpvYmplY3RMaXN0IDwtIG9iamVjdExpc3QgJT4lIG11dGF0ZShhbnN3ZXJfY2hhbmdlID0gKCgocmVzcG9uc2VzLTIwMCklJTEwKSklLyUyKQpvYmplY3RMaXN0IDwtIG9iamVjdExpc3QgJT4lIG11dGF0ZShhbnN3ZXJfY29ycmVjdCA9IGlmX2Vsc2UocmVzcG9uc2VzLTIwMCA8IDEwLDEsMCkpCm9iamVjdExpc3QgPC0gb2JqZWN0TGlzdCAlPiUgbXV0YXRlKHNpZ25hbF9kZXRlY3Rpb24gPSAyKmNoYW5nZSArIGFuc3dlcl9jb3JyZWN0KQpvYmplY3RMaXN0IDwtIG9iamVjdExpc3QgJT4lIG11dGF0ZShhZ2UgPSBpZl9lbHNlKHN1YmplY3QtMTAwID4gMTAwLCJvbGQiLCJ5b3VuZyIpKQpvYmplY3RMaXN0IDwtIG9iamVjdExpc3QgJT4lIG11dGF0ZShjb25kaXRpb25fdGV4dCA9IGlmX2Vsc2UoY29uZGl0aW9uID09IDEsIm5vdmVsIixpZl9lbHNlKGNvbmRpdGlvbiA9PSAyLCJleGVtcGxhciIsaWZfZWxzZShjb25kaXRpb24gPT0gMywic3RhdGUiLCJmZWF0dXJlIikpKSkKb2JqZWN0TGlzdCA8LSBvYmplY3RMaXN0ICU+JSBtdXRhdGUoc2lnbmFsX2RldGVjdGlvbl90ZXh0ID0gaWZfZWxzZShzaWduYWxfZGV0ZWN0aW9uID09IDAsImZhbHNlIGFsYXJtIixpZl9lbHNlKHNpZ25hbF9kZXRlY3Rpb24gPT0gMSwiY29ycmVjdCByZWplY3Rpb24iLGlmX2Vsc2Uoc2lnbmFsX2RldGVjdGlvbiA9PSAyLCJtaXNzIiwiaGl0IikpKSkKb2JqZWN0TGlzdCA8LSBvYmplY3RMaXN0ICU+JSBtdXRhdGUocGljX251bSA9IGFzLm51bWVyaWMoUGljKSkgJT4lIHRpZHlyOjpyZXBsYWNlX25hKGxpc3QoIHBpY19udW0gPSAwKSkKI3N1bU9iamVjdEFsbCA8LSBjb3VudChvYmplY3RMaXN0LCBzZXRzaXplLCBzaWduYWxfZGV0ZWN0aW9uX3RleHQpCiNzdW1PYmplY3RCeUFnZVNldFNpemUgPC0gY291bnQob2JqZWN0TGlzdCwgYWdlLCBzZXRzaXplLCBzaWduYWxfZGV0ZWN0aW9uX3RleHQpCiNzdW1PYmplY3RCeVN1YmplY3QgPC0gY291bnQob2JqZWN0TGlzdCwgc3ViamVjdCwgc2V0c2l6ZSwgc2lnbmFsX2RldGVjdGlvbl90ZXh0KQpvYmplY3RHcm91cEJ5U3ViQWdlU2V0IDwtIGdyb3VwX2J5KG9iamVjdExpc3QsIHN1YmplY3QsIGFnZSwgc2V0c2l6ZSkKc3VtbWFyaXNlKG9iamVjdEdyb3VwQnlTdWJBZ2VTZXQsIHRvdGFsQ2FzZXMgPSBuKCksIAogICAgICAgICAgbWVhbl9hbnN3ZXJfY29ycmVjdCA9IG1lYW4oYW5zd2VyX2NvcnJlY3QpLCAKICAgICAgICAgIG1lYW5fcmVzcG9uc2VfdGltZSA9IG1lYW4odGltZV8xKSwKICAgICAgICAgIG1lZGlhbl9yZXNwb25zZV90aW1lID0gbWVkaWFuKHRpbWVfMSksCiAgICAgICAgICBzdW1fYW5zd2VyX2NvcnJlY3QgPSBzdW0oYW5zd2VyX2NvcnJlY3QpLCAKICAgICAgICAgIHN1bV9vZl9jaGFuZ2VzID0gc3VtKGNoYW5nZSA9PSAxKSwKICAgICAgICAgIHN1bV9vZl9ub0NoYW5nZXMgPSBzdW0oY2hhbmdlID09IDApLAogICAgICAgICAgZmFsc2VBbGFybSA9IHN1bShzaWduYWxfZGV0ZWN0aW9uID09IDApLCAKICAgICAgICAgIGNvcnJlY3RfcmVqZWN0aW9ucyA9IHN1bShzaWduYWxfZGV0ZWN0aW9uID09IDEpLAogICAgICAgICAgbWlzcyA9IHN1bShzaWduYWxfZGV0ZWN0aW9uID09IDIpLAogICAgICAgICAgaGl0ID0gc3VtKHNpZ25hbF9kZXRlY3Rpb24gPT0gMyksIAogICAgICAgICAgdG90YWxPZkNoYW5nZSA9IGNvcnJlY3RfcmVqZWN0aW9ucytmYWxzZUFsYXJtLAogICAgICAgICAgdG90YWxPZkhpdCA9IGhpdCttaXNzLAogICAgICAgICAgZmFsc2VBbGFybVJhdGUgPSBmYWxzZUFsYXJtL3RvdGFsT2ZDaGFuZ2UsIAogICAgICAgICAgaGl0UmF0ZSA9IGhpdC90b3RhbE9mSGl0KSAlPiUgCiAgbXV0YXRlKGsgPSBzZXRzaXplKihoaXRSYXRlLWZhbHNlQWxhcm1SYXRlKSkgJT4lIAogIG11dGF0ZShrUGFzaGxlciA9IHNldHNpemUqKGhpdFJhdGUtZmFsc2VBbGFybVJhdGUpLygxLWZhbHNlQWxhcm1SYXRlKSkgJT4lIAogIG11dGF0ZShqb2luS2V5ID0gcGFzdGUwKHN1YmplY3Qsc2V0c2l6ZSkpIC0+IG9iamVjdFJlc3VsdApvYmplY3RHcm91cEJ5U3ViQWdlU2V0Q29uIDwtIGdyb3VwX2J5KG9iamVjdExpc3QsIHN1YmplY3QsIGFnZSwgc2V0c2l6ZSxjb25kaXRpb25fdGV4dCkKc3VtbWFyaXNlKG9iamVjdEdyb3VwQnlTdWJBZ2VTZXRDb24sIHRvdGFsQ2FzZXMgPSBuKCksIAogICAgICAgICAgbWVhbl9hbnN3ZXJfY29ycmVjdCA9IG1lYW4oYW5zd2VyX2NvcnJlY3QpLAogICAgICAgICAgbWVhbl9yZXNwb25zZV90aW1lID0gbWVhbih0aW1lXzEpLAogICAgICAgICAgbWVkaWFuX3Jlc3BvbnNlX3RpbWUgPSBtZWRpYW4odGltZV8xKSwKICAgICAgICAgIHN1bV9hbnN3ZXJfY29ycmVjdCA9IHN1bShhbnN3ZXJfY29ycmVjdCksIAogICAgICAgICAgc3VtX29mX2NoYW5nZXMgPSBzdW0oY2hhbmdlID09IDEpLAogICAgICAgICAgc3VtX29mX25vQ2hhbmdlcyA9IHN1bShjaGFuZ2UgPT0gMCksCiAgICAgICAgICBmYWxzZUFsYXJtID0gc3VtKHNpZ25hbF9kZXRlY3Rpb24gPT0gMCksIAogICAgICAgICAgY29ycmVjdF9yZWplY3Rpb25zID0gc3VtKHNpZ25hbF9kZXRlY3Rpb24gPT0gMSksCiAgICAgICAgICBtaXNzID0gc3VtKHNpZ25hbF9kZXRlY3Rpb24gPT0gMiksCiAgICAgICAgICBoaXQgPSBzdW0oc2lnbmFsX2RldGVjdGlvbiA9PSAzKSwgCiAgICAgICAgICB0b3RhbE9mQ2hhbmdlID0gY29ycmVjdF9yZWplY3Rpb25zK2ZhbHNlQWxhcm0sCiAgICAgICAgICB0b3RhbE9mSGl0ID0gaGl0K21pc3MsCiAgICAgICAgICBmYWxzZUFsYXJtUmF0ZSA9IGZhbHNlQWxhcm0vdG90YWxPZkNoYW5nZSwgCiAgICAgICAgICBoaXRSYXRlID0gaGl0L3RvdGFsT2ZIaXQpICU+JSAKICBtdXRhdGUoayA9IHNldHNpemUqKGhpdFJhdGUtZmFsc2VBbGFybVJhdGUpKSAlPiUgCiAgbXV0YXRlKGtQYXNobGVyID0gc2V0c2l6ZSooaGl0UmF0ZS1mYWxzZUFsYXJtUmF0ZSkvKDEtZmFsc2VBbGFybVJhdGUpKSAlPiUgCiAgbXV0YXRlKGpvaW5LZXkgPSBwYXN0ZTAoc3ViamVjdCxzZXRzaXplKSkgLT4gb2JqZWN0UmVzdWx0Q29uZGl0aW9uCm9iamVjdEdyb3VwQnlTdWJqZWN0IDwtIGdyb3VwX2J5KG9iamVjdExpc3QsIHN1YmplY3QsIGFnZSkKc3VtbWFyaXNlKG9iamVjdEdyb3VwQnlTdWJqZWN0LCAKICAgICAgICAgIFNldFNpemUyX2NvcnJlY3QgPSBtZWFuKGFuc3dlcl9jb3JyZWN0W3NldHNpemUgPT0gMl0pLAogICAgICAgICAgU2V0U2l6ZTRfY29ycmVjdCA9IG1lYW4oYW5zd2VyX2NvcnJlY3Rbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBTZXRTaXplNl9jb3JyZWN0ID0gbWVhbihhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDZdKSwKICAgICAgICAgIFNldFNpemUyX3NkID0gc2QoYW5zd2VyX2NvcnJlY3Rbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBTZXRTaXplNF9zZCA9IHNkKGFuc3dlcl9jb3JyZWN0W3NldHNpemUgPT0gNF0pLAogICAgICAgICAgU2V0U2l6ZTZfc2QgPSBzZChhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDZdKSwKICAgICAgICAgIFNldFNpemUyX3ZhciA9IHZhcihhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDJdKSwKICAgICAgICAgIFNldFNpemU0X3ZhciA9IHZhcihhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDRdKSwKICAgICAgICAgIFNldFNpemU2X3ZhciA9IHZhcihhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDZdKSwKICAgICAgICAgIFNldFNpemUyX2FhZCA9IGFhZChhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDJdKSwKICAgICAgICAgIFNldFNpemU0X2FhZCA9IGFhZChhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDRdKSwKICAgICAgICAgIFNldFNpemU2X2FhZCA9IGFhZChhbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDZdKSwKICAgICAgICAgIFNldFNpemUyX3RpbWUgPSBtZWRpYW4odGltZV8xW3NldHNpemUgPT0gMl0pLAogICAgICAgICAgU2V0U2l6ZTRfdGltZSA9IG1lZGlhbih0aW1lXzFbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBTZXRTaXplNl90aW1lID0gbWVkaWFuKHRpbWVfMVtzZXRzaXplID09IDZdKSwKICAgICAgICAgICkgLT4gb2JqZWN0UmVzdWx0U2V0U2l6ZQoKb2JqZWN0R3JvdXBBZ2UgPC0gZ3JvdXBfYnkob2JqZWN0UmVzdWx0LCBhZ2UpCnN1bW1hcmlzZShvYmplY3RHcm91cEFnZSwKICAgICAgICAgIFNldFNpemUyID0gbWVhbihtZWFuX2Fuc3dlcl9jb3JyZWN0W3NldHNpemUgPT0gMl0pLAogICAgICAgICAgU2V0U2l6ZTQgPSBtZWFuKG1lYW5fYW5zd2VyX2NvcnJlY3Rbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBTZXRTaXplNiA9IG1lYW4obWVhbl9hbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDZdKSwKICAgICAgICAgIGhpdF8yID0gbWVhbihoaXRbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBoaXRfNCA9IG1lYW4oaGl0W3NldHNpemUgPT0gNF0pLAogICAgICAgICAgaGl0XzYgPSBtZWFuKGhpdFtzZXRzaXplID09IDZdKSwKICAgICAgICAgIG1pc3NfMiA9IG1lYW4obWlzc1tzZXRzaXplID09IDJdKSwKICAgICAgICAgIG1pc3NfNCA9IG1lYW4obWlzc1tzZXRzaXplID09IDRdKSwKICAgICAgICAgIG1pc3NfNiA9IG1lYW4obWlzc1tzZXRzaXplID09IDZdKSwKICAgICAgICAgIGZhbHNlQWxhcm1SYXRlX1NldF8yID0gbWVhbihmYWxzZUFsYXJtUmF0ZVtzZXRzaXplID09IDJdKSwKICAgICAgICAgIGZhbHNlQWxhcm1SYXRlX1NldF80ID0gbWVhbihmYWxzZUFsYXJtUmF0ZVtzZXRzaXplID09IDRdKSwKICAgICAgICAgIGZhbHNlQWxhcm1SYXRlX1NldF82ID0gbWVhbihmYWxzZUFsYXJtUmF0ZVtzZXRzaXplID09IDZdKSwKICAgICAgICAgIEhpdFJhdGVfU2V0XzIgPSBtZWFuKGhpdFJhdGVbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBIaXRSYXRlX1NldF80ID0gbWVhbihoaXRSYXRlW3NldHNpemUgPT0gNF0pLAogICAgICAgICAgSGl0UmF0ZV9TZXRfNiA9IG1lYW4oaGl0UmF0ZVtzZXRzaXplID09IDZdKSwKICAgICAgICAgIEtfMl9tZWFuID0gbWVhbihrW3NldHNpemUgPT0gMl0pLAogICAgICAgICAgS180X21lYW4gPSBtZWFuKGtbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBLXzZfbWVhbiA9IG1lYW4oa1tzZXRzaXplID09IDZdKSwKICAgICAgICAgIEtfMl9tZWRpYW4gPSBtZWRpYW4oa1tzZXRzaXplID09IDJdKSwKICAgICAgICAgIEtfNF9tZWRpYW4gPSBtZWRpYW4oa1tzZXRzaXplID09IDRdKSwKICAgICAgICAgIEtfNl9tZWRpYW4gPSBtZWRpYW4oa1tzZXRzaXplID09IDZdKSwKICAgICAgICAgIEtfMl9NYXggPSBtYXgoa1tzZXRzaXplID09IDJdKSwKICAgICAgICAgIEtfNF9NYXggPSBtYXgoa1tzZXRzaXplID09IDRdKSwKICAgICAgICAgIEtfNl9NYXggPSBtYXgoa1tzZXRzaXplID09IDZdKSkgLT4gb2JqZWN0UmVzdWx0R3JvdXBBZ2UKCm9iamVjdEdyb3VwQWdlQ29uIDwtIGdyb3VwX2J5KG9iamVjdFJlc3VsdENvbmRpdGlvbiwgYWdlKQpzdW1tYXJpc2Uob2JqZWN0R3JvdXBBZ2VDb24sCiAgICAgICAgICBTZXRTaXplMiA9IG1lYW4obWVhbl9hbnN3ZXJfY29ycmVjdFtzZXRzaXplID09IDJdKSwKICAgICAgICAgIFNldFNpemU0ID0gbWVhbihtZWFuX2Fuc3dlcl9jb3JyZWN0W3NldHNpemUgPT0gNF0pLAogICAgICAgICAgU2V0U2l6ZTYgPSBtZWFuKG1lYW5fYW5zd2VyX2NvcnJlY3Rbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBoaXRfMiA9IG1lYW4oaGl0W3NldHNpemUgPT0gMl0pLAogICAgICAgICAgaGl0XzQgPSBtZWFuKGhpdFtzZXRzaXplID09IDRdKSwKICAgICAgICAgIGhpdF82ID0gbWVhbihoaXRbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBtaXNzXzIgPSBtZWFuKG1pc3Nbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBtaXNzXzQgPSBtZWFuKG1pc3Nbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBtaXNzXzYgPSBtZWFuKG1pc3Nbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBmYWxzZUFsYXJtUmF0ZV9TZXRfMiA9IG1lYW4oZmFsc2VBbGFybVJhdGVbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBmYWxzZUFsYXJtUmF0ZV9TZXRfNCA9IG1lYW4oZmFsc2VBbGFybVJhdGVbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBmYWxzZUFsYXJtUmF0ZV9TZXRfNiA9IG1lYW4oZmFsc2VBbGFybVJhdGVbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBIaXRSYXRlX1NldF8yID0gbWVhbihoaXRSYXRlW3NldHNpemUgPT0gMl0pLAogICAgICAgICAgSGl0UmF0ZV9TZXRfNCA9IG1lYW4oaGl0UmF0ZVtzZXRzaXplID09IDRdKSwKICAgICAgICAgIEhpdFJhdGVfU2V0XzYgPSBtZWFuKGhpdFJhdGVbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBLXzJfbWVhbiA9IG1lYW4oa1tzZXRzaXplID09IDJdKSwKICAgICAgICAgIEtfNF9tZWFuID0gbWVhbihrW3NldHNpemUgPT0gNF0pLAogICAgICAgICAgS182X21lYW4gPSBtZWFuKGtbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBLXzJfbWVkaWFuID0gbWVkaWFuKGtbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBLXzRfbWVkaWFuID0gbWVkaWFuKGtbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBLXzZfbWVkaWFuID0gbWVkaWFuKGtbc2V0c2l6ZSA9PSA2XSksCiAgICAgICAgICBLXzJfTWF4ID0gbWF4KGtbc2V0c2l6ZSA9PSAyXSksCiAgICAgICAgICBLXzRfTWF4ID0gbWF4KGtbc2V0c2l6ZSA9PSA0XSksCiAgICAgICAgICBLXzZfTWF4ID0gbWF4KGtbc2V0c2l6ZSA9PSA2XSkpIC0+IG9iamVjdFJlc3VsdEdyb3VwQWdlQ29uZGl0aW9uCgpjb2xvckdyb3VwQWdlIDwtIGdyb3VwX2J5KGNvbG9yTGlzdFJlc3VsdCwgYWdlKQpzdW1tYXJpc2UoY29sb3JHcm91cEFnZSwKICAgICAgICAgIFNldFNpemUyID0gbWVhbihtZWFuX2Fuc3dlcl9jb3JyZWN0W2NvbmRpdGlvbiA9PSAyXSksCiAgICAgICAgICBTZXRTaXplNCA9IG1lYW4obWVhbl9hbnN3ZXJfY29ycmVjdFtjb25kaXRpb24gPT0gNF0pLAogICAgICAgICAgU2V0U2l6ZTYgPSBtZWFuKG1lYW5fYW5zd2VyX2NvcnJlY3RbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIGhpdF8yID0gbWVhbihoaXRbY29uZGl0aW9uID09IDJdKSwKICAgICAgICAgIGhpdF80ID0gbWVhbihoaXRbY29uZGl0aW9uID09IDRdKSwKICAgICAgICAgIGhpdF82ID0gbWVhbihoaXRbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIG1pc3NfMiA9IG1lYW4obWlzc1tjb25kaXRpb24gPT0gMl0pLAogICAgICAgICAgbWlzc180ID0gbWVhbihtaXNzW2NvbmRpdGlvbiA9PSA0XSksCiAgICAgICAgICBtaXNzXzYgPSBtZWFuKG1pc3NbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIGZhbHNlQWxhcm1SYXRlX1NldF8yID0gbWVhbihmYWxzZUFsYXJtUmF0ZVtjb25kaXRpb24gPT0gMl0pLAogICAgICAgICAgZmFsc2VBbGFybVJhdGVfU2V0XzQgPSBtZWFuKGZhbHNlQWxhcm1SYXRlW2NvbmRpdGlvbiA9PSA0XSksCiAgICAgICAgICBmYWxzZUFsYXJtUmF0ZV9TZXRfNiA9IG1lYW4oZmFsc2VBbGFybVJhdGVbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIEhpdFJhdGVfU2V0XzIgPSBtZWFuKGhpdFJhdGVbY29uZGl0aW9uID09IDJdKSwKICAgICAgICAgIEhpdFJhdGVfU2V0XzQgPSBtZWFuKGhpdFJhdGVbY29uZGl0aW9uID09IDRdKSwKICAgICAgICAgIEhpdFJhdGVfU2V0XzYgPSBtZWFuKGhpdFJhdGVbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIEtfMl9tZWFuID0gbWVhbihrW2NvbmRpdGlvbiA9PSAyXSksCiAgICAgICAgICBLXzRfbWVhbiA9IG1lYW4oa1tjb25kaXRpb24gPT0gNF0pLAogICAgICAgICAgS182X21lYW4gPSBtZWFuKGtbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIEtfMl9tZWRpYW4gPSBtZWRpYW4oa1tjb25kaXRpb24gPT0gMl0pLAogICAgICAgICAgS180X21lZGlhbiA9IG1lZGlhbihrW2NvbmRpdGlvbiA9PSA0XSksCiAgICAgICAgICBLXzZfbWVkaWFuID0gbWVkaWFuKGtbY29uZGl0aW9uID09IDZdKSwKICAgICAgICAgIEtfMl9NYXggPSBtYXgoa1tjb25kaXRpb24gPT0gMl0pLAogICAgICAgICAgS180X01heCA9IG1heChrW2NvbmRpdGlvbiA9PSA0XSksCiAgICAgICAgICBLXzZfTWF4ID0gbWF4KGtbY29uZGl0aW9uID09IDZdKSkgLT4gY29sb3JSZXN1bHRHcm91cEFnZQoKYGBgCmpvaW4gY29sb3IgJiBvYmplY3RzCmBgYHtyfQpjb2xvckxpc3RSZXN1bHQgJT4ldW5ncm91cCgpICU+JSAgc2VsZWN0KGFnZSxjb25kaXRpb24sbWVhbl9hbnN3ZXJfY29ycmVjdCxtZWFuX3Jlc3BvbnNlX3RpbWUsa1Bhc2hsZXIsayxqb2luS2V5KSAtPiBDb2xvckpvaW4KbmFtZXMoQ29sb3JKb2luKSA8LSBjKCJhZ2VfYyIsImNvbmRpdGlvbl9jIiwibWVhbl9hbnN3ZXJfY29ycmVjdF9jIiwibWVhbl9yZXNwb25zZV90aW1lX2MiLCJrUGFzaGxlcl9jIiwia19jIiwiam9pbktleSIpIApvYmplY3RSZXN1bHQgJT4lIGlubmVyX2pvaW4oQ29sb3JKb2luLGJ5ID0gImpvaW5LZXkiKSAgJT4lIAogIG11dGF0ZShkaWZmQW5zd2VyUmF0ZSA9IG1lYW5fYW5zd2VyX2NvcnJlY3QtbWVhbl9hbnN3ZXJfY29ycmVjdF9jKSU+JSAKICBtdXRhdGUoZGlmZksgPSBrLWtfYyktPiB0ZXN0c0pvaW5lZApvYmplY3RSZXN1bHRDb25kaXRpb24gJT4lIGlubmVyX2pvaW4oQ29sb3JKb2luLGJ5ID0gImpvaW5LZXkiKSAtPiB0ZXN0Q29uZGl0aW9uSm9pbmVkCmNvbG9yTGlzdFJlc3VsdCAlPiUgdW5ncm91cCgpICU+JSBzZWxlY3Qoc3ViamVjdCxhZ2UsY29uZGl0aW9uLG1lYW5fYW5zd2VyX2NvcnJlY3QsbWVhbl9yZXNwb25zZV90aW1lLGtQYXNobGVyLGspICU+JSBtdXRhdGUodGVzdD0iY29sb3IiKSAlPiUgcmVuYW1lKHNldHNpemUgPSBjb25kaXRpb24pIC0+IENvbG9ySm9pbkxvbmcKb2JqZWN0UmVzdWx0ICU+JSAgdW5ncm91cCgpICU+JSBzZWxlY3Qoc3ViamVjdCxhZ2Usc2V0c2l6ZSxtZWFuX2Fuc3dlcl9jb3JyZWN0LG1lYW5fcmVzcG9uc2VfdGltZSxrUGFzaGxlcixrKSAlPiUgbXV0YXRlKHRlc3Q9Im9iamVjdCIpIC0+IE9iamVjdEpvaW5Mb25nCmpvaW5lZFRlc3RMaXN0ID0gcmJpbmQoT2JqZWN0Sm9pbkxvbmcsQ29sb3JKb2luTG9uZykKYGBgCgoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKRXJzdGVyIFNjaHJpdHQgw5xiZXJibGljayBkZXIgR2VzYW10YW56YWhsIGRlciBmYWxzY2hlbiB1bmQgcmljaHRpZ2VuIEFudHdvcnRlbgpgYGB7ciBlY2hvPUZBTFNFfQpjb3VudExpc3QgPC0gY29sb3JMaXN0ICU+JSBjb3VudChhbnN3ZXJfY29ycmVjdCxjb25kaXRpb24pICU+JSByZW5hbWUoQW50d29ydCA9IGFuc3dlcl9jb3JyZWN0KSAlPiUgbXV0YXRlKEFudHdvcnQgPSBmYWN0b3IoQW50d29ydCwgbGV2ZWxzID0gYygwLDEpLGxhYmVscyA9IGMoInJpY2h0aWciLCAiZmFsc2NoIikpKQoKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCkdpYiBlaW5lIFRhYmVsbGUgbWl0IGRlbiB6dXNhbW1lbmZhc3NlbmRlbiBEYXRlbiBmw7xyIENvbG9yICYgT2JqZWN0cyBhdXMKYGBge3J9CmNvbG9yTGlzdCAlPiUgZ3JvdXBfYnkoY29uZGl0aW9uLGFnZSkgJT4lIHN1bW1hcmlzZShHZXNhbXQgPSBuKCksUmljaHRpZyA9IHN1bShhbnN3ZXJfY29ycmVjdCA9PSAxKSxGYWxzY2ggPSBzdW0oYW5zd2VyX2NvcnJlY3QgPT0gMCksIFByb3plbnRSaWNodGlnID0gc2NhbGVzOjpwZXJjZW50KHJvdW5kKG1lYW4oYW5zd2VyX2NvcnJlY3QgPT0gMSksMikpLFByb3plbnRGYWxzY2ggPSBzY2FsZXM6OnBlcmNlbnQocm91bmQobWVhbihhbnN3ZXJfY29ycmVjdCA9PSAwKSwyKSkpICU+JSByZW5hbWUoU2V0U2l6ZSA9IGNvbmRpdGlvbikgJT4lIGthYmxlKGNhcHRpb24gPSAiw5xiZXJibGljayBWZXJzdWNoc3JlaWhlIENvbG9yIixhbGlnbiA9ICJsbGNjY3JyIikKCm9iamVjdExpc3QgJT4lIGdyb3VwX2J5KHNldHNpemUsYWdlKSAlPiUgc3VtbWFyaXNlKEdlc2FtdCA9IG4oKSxSaWNodGlnID0gc3VtKGFuc3dlcl9jb3JyZWN0ID09IDEpLEZhbHNjaCA9IHN1bShhbnN3ZXJfY29ycmVjdCA9PSAwKSwgUHJvemVudFJpY2h0aWcgPSBzY2FsZXM6OnBlcmNlbnQocm91bmQobWVhbihhbnN3ZXJfY29ycmVjdCA9PSAxKSwyKSksUHJvemVudEZhbHNjaCA9IHNjYWxlczo6cGVyY2VudChyb3VuZChtZWFuKGFuc3dlcl9jb3JyZWN0ID09IDApLDIpKSkgJT4lIGthYmxlKGNhcHRpb24gPSAiw5xiZXJibGljayBWZXJzdWNoc3JlaWhlIFJlYWwgd29ybGQgb2JqZWN0cyIsYWxpZ24gPSAibGxjY2NyciIpCgojY29sb3JMaXN0UmVzdWx0ICU+JSB1bmdyb3VwKCkgJT4lIGdyb3VwX2J5KGFnZSxjb25kaXRpb24pICU+JSBzdW1tYXJpc2UobWVhbihoaXRSYXRlKSxtZWFuKGZhbHNlQWxhcm1SYXRlKSxtZWFuKGspLG1lYW4oa1Bhc2hsZXIpKSU+JSBrYWJsZShjYXB0aW9uID0gIsOcYmVyYmxpY2sgVmVyc3VjaHNyZWloZSBDb2xvciBvYmplY3RzIEsiLGFsaWduID0gImxsY2NjcnIiKQoKCmBgYAoKClBsb3R0ZSBlaW5lbiDDnGJlcmJsaWNrIGRlciBHZXNhbXRtZW5nZQpgYGB7cn0KCmNvbG9yTGlzdCAlPiUgbXV0YXRlKGFnZT1mYWN0b3IoYWdlLCBsZXZlbHMgPSBjKCJ5b3VuZyIsIm9sZCIpKSwKICAgICAgICAgICAgIGFuc3dlcl9jb3JyZWN0PWZhY3RvcihhbnN3ZXJfY29ycmVjdCwgbGV2ZWxzID0gYygwLDEpLGxhYmVscyA9IGMoIkZhbHNlIiwiQ29ycmVjdCIpKSkgJT4lCiAgZ3JvdXBfYnkoYWdlLGNvbmRpdGlvbixhbnN3ZXJfY29ycmVjdCkgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShhZ2UsY29uZGl0aW9uKSAlPiUgCiAgbXV0YXRlKFRvdGFsPXN1bShOKSxQZXJjZW50PU4vVG90YWwsCiAgICAgICAgIExhYj1wYXN0ZTAoTiwnICgnLHBhc3RlMChyb3VuZCgxMDAqUGVyY2VudCwwKSwnJScpLCcpJykpIC0+IFN1bXNDb2xvcnMKI1Bsb3QKZ2dwbG90KFN1bXNDb2xvcnMsYWVzKHg9YWdlLHk9TixmaWxsPWFuc3dlcl9jb3JyZWN0KSkrCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2soKSkrCiAgZmFjZXRfd3JhcCgufmNvbmRpdGlvbixzY2FsZXMgPSAnZnJlZScpKwogIGdlb21fdGV4dChhZXMobGFiZWw9TGFiKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpLHNpemU9MykrCiAgZ2VvbV90ZXh0KGFlcyh5PVRvdGFsLGxhYmVsPVRvdGFsKSx2anVzdD0tMC4yNSxzaXplPTMpKwogIGxhYnModGl0bGU9IkNvbG9ycyIsc3VidGl0bGUgPSAicGVyIHNldHNpemUgZ3JvdXBlZCBieSBhZ2UiLCB4PSJhZ2UiLCB5PSIjIGFuc3dlciBjb3JyZWN0IiwgZmlsbD0iQW5zd2VyIikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikrCiAgeWxpbSgwLCAxNDAwKQoKb2JqZWN0TGlzdCAlPiUgbXV0YXRlKGFnZT1mYWN0b3IoYWdlLCBsZXZlbHMgPSBjKCJ5b3VuZyIsIm9sZCIpKSwKICAgICAgICAgICAgIGFuc3dlcl9jb3JyZWN0PWZhY3RvcihhbnN3ZXJfY29ycmVjdCwgbGV2ZWxzID0gYygwLDEpLGxhYmVscyA9IGMoIkZhbHNlIiwiQ29ycmVjdCIpKSkgJT4lCiAgZ3JvdXBfYnkoYWdlLHNldHNpemUsYW5zd2VyX2NvcnJlY3QpICU+JSBzdW1tYXJpc2UoTj1uKCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoYWdlLHNldHNpemUpICU+JSAKICBtdXRhdGUoVG90YWw9c3VtKE4pLFBlcmNlbnQ9Ti9Ub3RhbCwKICAgICAgICAgTGFiPXBhc3RlMChOLCcgKCcscGFzdGUwKHJvdW5kKDEwMCpQZXJjZW50LDApLCclJyksJyknKSkgLT4gU3Vtc09iamVjdHMKI1Bsb3QKZ2dwbG90KFN1bXNPYmplY3RzLGFlcyh4PWFnZSx5PU4sZmlsbD1hbnN3ZXJfY29ycmVjdCkpKwogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKCkpKwogIGZhY2V0X3dyYXAoLn5zZXRzaXplLHNjYWxlcyA9ICdmcmVlJykrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MYWIpLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSksc2l6ZT0zKSsKICBnZW9tX3RleHQoYWVzKHk9VG90YWwsbGFiZWw9VG90YWwpLHZqdXN0PS0wLjI1LHNpemU9MykrCiAgbGFicyh0aXRsZT0iUmVhbCB3b3JsZCBvYmplY3RzIixzdWJ0aXRsZSA9ICJwZXIgc2V0c2l6ZSBncm91cGVkIGJ5IGFnZSIsIHg9ImFnZSIsIHk9IiMgYW5zd2VyIGNvcnJlY3QiLCBmaWxsPSJBbnN3ZXIiKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDEiKQoKYGBgClBsb3R0ZSBkaWUgU3RyZXV1bmcgdm9uIENvbG9ycyB1bmQgcmVhbCBvYmplY3RzCgpgYGB7cn0KY29sb3JMaXN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PW1lYW5fYW5zd2VyX2NvcnJlY3QsZmlsbD1hZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK3NjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpK2xhYnModGl0bGU9IkNvbG9ycyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGNvcnJlY3QgYW5zd2VycyIsIHg9ImFnZSIsIHk9Im1lYW4gYW5zd2VycyBjb3JyZWN0IiwgZmlsbD0iQW5zd2VyIikKCm9iamVjdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PWFnZSwgeT1tZWFuX2Fuc3dlcl9jb3JyZWN0LGZpbGw9YWdlKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KStzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KStsYWJzKHRpdGxlPSJSZWFsIHdvcmxkIG9iamVjdHMiLHN1YnRpdGxlID0gImRpc3RyaWJ1dGlvbiB0ZXN0IHBlcnNvbnMgbWVhbiB2YWx1ZSBvZiBjb3JyZWN0IGFuc3dlcnMiLCB4PSJhZ2UiLCB5PSJtZWFuIGFuc3dlcnMgY29ycmVjdCIsIGZpbGw9IkFuc3dlciIpCgpjb2xvckxpc3RSZXN1bHQgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1hZ2UsIHk9bWVhbl9hbnN3ZXJfY29ycmVjdCxmaWxsPWFnZSkpKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KStmYWNldF93cmFwKC5+Y29uZGl0aW9uLHNjYWxlcyA9ICdmcmVlJykrc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrbGFicyh0aXRsZT0iQ29sb3JzIixzdWJ0aXRsZSA9ICJkaXN0cmlidXRpb24gdGVzdCBwZXJzb25zIG1lYW4gdmFsdWUgb2YgY29ycmVjdCBhbnN3ZXJzIiwgeD0iYWdlIiwgeT0ibWVhbiBhbnN3ZXJzIGNvcnJlY3QiLCBmaWxsPSJBbnN3ZXIiKQoKb2JqZWN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PW1lYW5fYW5zd2VyX2NvcnJlY3QsZmlsbD1hZ2UpKSsgZ2VvbV92aW9saW4oKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikrZmFjZXRfd3JhcCgufnNldHNpemUsc2NhbGVzID0gJ2ZyZWUnKStzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KStsYWJzKHRpdGxlPSJSZWFsIHdvcmxkIG9iamVjdHMiLHN1YnRpdGxlID0gImRpc3RyaWJ1dGlvbiB0ZXN0IHBlcnNvbnMgbWVhbiB2YWx1ZSBvZiBjb3JyZWN0IGFuc3dlcnMiLCB4PSJhZ2UiLCB5PSJtZWFuIGFuc3dlcnMgY29ycmVjdCIsIGZpbGw9IkFuc3dlciIpCgpjb2xvckxpc3RSZXN1bHQgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1hZ2UsIHk9bWVhbl9hbnN3ZXJfY29ycmVjdCxmaWxsPWFnZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK3NjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpK2xhYnModGl0bGU9IkNvbG9ycyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGNvcnJlY3QgYW5zd2VycyIsIHg9ImFnZSIsIHk9Im1lYW4gYW5zd2VycyBjb3JyZWN0IiwgZmlsbD0iQW5zd2VyIikKCm9iamVjdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PWFnZSwgeT1tZWFuX2Fuc3dlcl9jb3JyZWN0LGZpbGw9YWdlKSkgKyBnZW9tX2JveHBsb3QoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikrc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrbGFicyh0aXRsZT0iUmVhbCB3b3JsZCBvYmplY3RzIixzdWJ0aXRsZSA9ICJkaXN0cmlidXRpb24gdGVzdCBwZXJzb25zIG1lYW4gdmFsdWUgb2YgY29ycmVjdCBhbnN3ZXJzIiwgeD0iYWdlIiwgeT0ibWVhbiBhbnN3ZXJzIGNvcnJlY3QiLCBmaWxsPSJBbnN3ZXIiKQoKY29sb3JMaXN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PW1lYW5fYW5zd2VyX2NvcnJlY3QsZmlsbD1hZ2UpKSsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK2ZhY2V0X3dyYXAoLn5jb25kaXRpb24sc2NhbGVzID0gJ2ZyZWUnKStzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KStsYWJzKHRpdGxlPSJDb2xvcnMiLHN1YnRpdGxlID0gImRpc3RyaWJ1dGlvbiB0ZXN0IHBlcnNvbnMgbWVhbiB2YWx1ZSBvZiBjb3JyZWN0IGFuc3dlcnMiLCB4PSJhZ2UiLCB5PSJtZWFuIGFuc3dlcnMgY29ycmVjdCIsIGZpbGw9IkFuc3dlciIpCgpvYmplY3RSZXN1bHQgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1hZ2UsIHk9bWVhbl9hbnN3ZXJfY29ycmVjdCxmaWxsPWFnZSkpKyBnZW9tX2JveHBsb3QoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikrZmFjZXRfd3JhcCgufnNldHNpemUsc2NhbGVzID0gJ2ZyZWUnKStzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KStsYWJzKHRpdGxlPSJSZWFsIHdvcmxkIG9iamVjdHMiLHN1YnRpdGxlID0gImRpc3RyaWJ1dGlvbiB0ZXN0IHBlcnNvbnMgbWVhbiB2YWx1ZSBvZiBjb3JyZWN0IGFuc3dlcnMiLCB4PSJhZ2UiLCB5PSJtZWFuIGFuc3dlcnMgY29ycmVjdCIsIGZpbGw9IkFuc3dlciIpCmBgYAoKSMOkdWZpZ2tlaXRzdmVydGVpbHVuZwpgYGB7cn0KY29sb3JMaXN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9bWVhbl9hbnN3ZXJfY29ycmVjdCwgZmlsbD1hZ2UpKSsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwKStsYWJzKHRpdGxlPSJDb2xvcnMiLHN1YnRpdGxlID0gIkjDpHVmaWdrZWl0ZW4ga29ycmVrdGVyIEFudHdvcnRlbiIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0Iikrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkKCmNvbG9yTGlzdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIGZpbGw9YWdlKSkrIGdlb21faGlzdG9ncmFtKGJpbnM9MjApK2ZhY2V0X3dyYXAoLn5jb25kaXRpb24sc2NhbGVzID0gJ2ZyZWUnKStzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KStsYWJzKHRpdGxlPSJDb2xvcnMiLHN1YnRpdGxlID0gIkjDpHVmaWdrZWl0ZW4ga29ycmVrdGVyIEFudHdvcnRlbiIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0IikKCm9iamVjdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIGZpbGw9YWdlKSkrIGdlb21faGlzdG9ncmFtKGJpbnM9MjApK2xhYnModGl0bGU9IlJlYWwgd29ybGQgb2JqZWN0cyIsc3VidGl0bGUgPSAiSMOkdWZpZ2tlaXRlbiBrb3JyZWt0ZXIgQW50d29ydGVuIiwgeD0iTWVhbiBhbnN3ZXJzIGNvcnJlY3QiKStzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQoKb2JqZWN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9bWVhbl9hbnN3ZXJfY29ycmVjdCwgZmlsbD1hZ2UpKSsgZ2VvbV9oaXN0b2dyYW0oYmlucz0yMCkrZmFjZXRfd3JhcCgufnNldHNpemUsc2NhbGVzID0gJ2ZyZWUnKStzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KStsYWJzKHRpdGxlPSJSZWFsIHdvcmxkIG9iamVjdHMiLHN1YnRpdGxlID0gIkjDpHVmaWdrZWl0ZW4ga29ycmVrdGVyIEFudHdvcnRlbiIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0IikKCmNvbG9yTGlzdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIGZpbGw9YWdlKSkrIGdlb21fZGVuc2l0eSAoYWxwaGE9MC4yKStsYWJzKHRpdGxlPSJDb2xvcnMiLHN1YnRpdGxlID0gIkjDpHVmaWdrZWl0ZW4ga29ycmVrdGVyIEFudHdvcnRlbiIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0Iikrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkKCmNvbG9yTGlzdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIGZpbGw9YWdlKSkrIGdlb21fZGVuc2l0eSggYWxwaGE9MC4yKStmYWNldF93cmFwKC5+Y29uZGl0aW9uLHNjYWxlcyA9ICdmcmVlJykrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrbGFicyh0aXRsZT0iQ29sb3JzIixzdWJ0aXRsZSA9ICJIw6R1Zmlna2VpdGVuIGtvcnJla3RlciBBbnR3b3J0ZW4iLCB4PSJNZWFuIGFuc3dlcnMgY29ycmVjdCIpCgpvYmplY3RSZXN1bHQgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1tZWFuX2Fuc3dlcl9jb3JyZWN0LCBmaWxsPWFnZSkpKyBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKStsYWJzKHRpdGxlPSJSZWFsIHdvcmxkIG9iamVjdHMiLHN1YnRpdGxlID0gIkjDpHVmaWdrZWl0ZW4ga29ycmVrdGVyIEFudHdvcnRlbiIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0Iikrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkKCm9iamVjdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIGZpbGw9YWdlKSkrIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpK2ZhY2V0X3dyYXAoLn5zZXRzaXplLHNjYWxlcyA9ICdmcmVlJykrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrbGFicyh0aXRsZT0iUmVhbCB3b3JsZCBvYmplY3RzIixzdWJ0aXRsZSA9ICJIw6R1Zmlna2VpdGVuIGtvcnJla3RlciBBbnR3b3J0ZW4iLCB4PSJNZWFuIGFuc3dlcnMgY29ycmVjdCIpCmBgYApWZXJnbGVpY2ggQ29sb3IgdnMuIE9iamVjdHMgZ2xlaWNoZSBBbHRlcnNncnVwcGVuCgpgYGB7cn0Kam9pbmVkVGVzdExpc3QgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1tZWFuX2Fuc3dlcl9jb3JyZWN0LCBmaWxsPXRlc3QpKSsgZ2VvbV9kZW5zaXR5IChhbHBoYT0wLjIpK2xhYnModGl0bGU9IkNvbG9ycyB2cyBPYmplY3QiLHN1YnRpdGxlID0gIkjDpHVmaWdrZWl0ZW4ga29ycmVrdGVyIEFudHdvcnRlbiIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0Iikrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkKam9pbmVkVGVzdExpc3QgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1tZWFuX2Fuc3dlcl9jb3JyZWN0LCBmaWxsPXRlc3QpKSsgZ2VvbV9kZW5zaXR5IChhbHBoYT0wLjIpK2ZhY2V0X3dyYXAoLn5zZXRzaXplLHNjYWxlcyA9ICdmcmVlJykrbGFicyh0aXRsZT0iQ29sb3JzIHZzIE9iamVjdCIsc3VidGl0bGUgPSAiSMOkdWZpZ2tlaXRlbiBrb3JyZWt0ZXIgQW50d29ydGVuIHBlciBTZXQgR3LDtsOfZSIsIHg9Ik1lYW4gYW5zd2VycyBjb3JyZWN0Iikrc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkKYGBgCgoKS29ycmVsYXRpb24gCmBgYHtyfQpjb2xvckxpc3RSZXN1bHQgJT4lIGdncGxvdChhZXMoeD1tZWFuX2Fuc3dlcl9jb3JyZWN0LCB5PW1lYW5fcmVzcG9uc2VfdGltZSxjb2xvciA9IGFnZSkpK2dlb21fcG9pbnQoKStnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgc2UgPSBGQUxTRSkKY29sb3JMaXN0UmVzdWx0ICU+JSBnZ3Bsb3QoYWVzKHg9bWVhbl9hbnN3ZXJfY29ycmVjdCwgeT1tZWFuX3Jlc3BvbnNlX3RpbWUsY29sb3IgPSBhZ2UpKStnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc3BhbiA9IDAuMTUsIG1ldGhvZC5hcmdzID0gbGlzdChkZWdyZWU9MSkpCmNvbG9yTGlzdFJlc3VsdCAlPiUgZ2dwbG90KGFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIHk9bWVhbl9yZXNwb25zZV90aW1lLGNvbG9yID0gYWdlKSkrZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKStmYWNldF93cmFwKC5+Y29uZGl0aW9uLHNjYWxlcyA9ICdmcmVlJykKb2JqZWN0UmVzdWx0ICU+JSBnZ3Bsb3QoYWVzKHg9bWVhbl9hbnN3ZXJfY29ycmVjdCwgeT1tZWFuX3Jlc3BvbnNlX3RpbWUsY29sb3IgPSBhZ2UpKStnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlID0gRkFMU0UpCm9iamVjdFJlc3VsdCAlPiUgZ2dwbG90KGFlcyh4PW1lYW5fYW5zd2VyX2NvcnJlY3QsIHk9bWVhbl9yZXNwb25zZV90aW1lLGNvbG9yID0gYWdlKSkrZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKStmYWNldF93cmFwKC5+c2V0c2l6ZSxzY2FsZXMgPSAnZnJlZScpCgpgYGAKb2JqZWN0UmVzdWx0ICU+JSBmaWx0ZXIoYWdlPT0ieW91bmciLHNldHNpemU9PTYpICU+JSB1bmdyb3VwICU+JSBzZWxlY3QobWVhbl9hbnN3ZXJfY29ycmVjdCkgLT4gdGVzdEl0CnNoYXBpcm8udGVzdCh0ZXN0SXQkbWVhbl9hbnN3ZXJfY29ycmVjdCkKCk5vcm1hbHZlcnRlaWx1bmc6CmBgYHtyfQpjb2xvckxpc3RSZXN1bHQgJT4lIGZpbHRlcihjb25kaXRpb249PTIsYWdlPT0ib2xkIikgLT4gZGZfbWVhbnNfbzIKZnJvbVRvIDwtIHJvdW5kKHJhbmdlKGRmX21lYW5zX28yJG1lYW5fYW5zd2VyX2NvcnJlY3QpLDIpK2MoLTAuMDgsMC4wOCkKbGltaXRzIDwtIHNlcShmcm9tPWZyb21Ub1sxXSwgdG89ZnJvbVRvWzJdLCBieT0wLjAyKQpoaXN0KGRmX21lYW5zX28yJG1lYW5fYW5zd2VyX2NvcnJlY3QsZnJlcT1GQUxTRSx4bGltID0gZnJvbVRvICx4bGFiID0gIk1pdHRlbHdlcnQga29ycmVrdGUgQW50d29ydGVuIix5bGFiID0gInJlbGF0aXZlIEjDpHVmaWdrZWl0IixicmVha3M9bGltaXRzLG1haW4gPSAiSGlzdG9ncmFtbSAmIE5vcm1hbHZlcnRlaWx1bmcgZsO8ciBPbGQsIFNldHNpemUgMiIpCnJ1ZyhqaXR0ZXIoZGZfbWVhbnNfbzIkbWVhbl9hbnN3ZXJfY29ycmVjdCkpCmN1cnZlKGRub3JtKHgsbWVhbihkZl9tZWFuc19vMiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSxzZChkZl9tZWFuc19vMiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSksbHdkPTIsY29sPSJibHVlIixhZGQ9VFJVRSkKY29sb3JMaXN0UmVzdWx0ICU+JSBmaWx0ZXIoY29uZGl0aW9uPT00LGFnZT09Im9sZCIpIC0+IGRmX21lYW5zX280CmZyb21UbyA8LSByb3VuZChyYW5nZShkZl9tZWFuc19vNCRtZWFuX2Fuc3dlcl9jb3JyZWN0KSwyKStjKC0wLjA4LDAuMDgpCmxpbWl0cyA8LSBzZXEoZnJvbT1mcm9tVG9bMV0sIHRvPWZyb21Ub1syXSwgYnk9MC4wMikKaGlzdChkZl9tZWFuc19vNCRtZWFuX2Fuc3dlcl9jb3JyZWN0LGZyZXE9RkFMU0UseGxpbSA9IGZyb21UbyAseGxhYiA9ICJNaXR0ZWx3ZXJ0IGtvcnJla3RlIEFudHdvcnRlbiIseWxhYiA9ICJyZWxhdGl2ZSBIw6R1Zmlna2VpdCIsYnJlYWtzPWxpbWl0cyxtYWluID0gIkhpc3RvZ3JhbW0gJiBOb3JtYWx2ZXJ0ZWlsdW5nIGbDvHIgT2xkLCBTZXRzaXplIDQiKQpydWcoaml0dGVyKGRmX21lYW5zX280JG1lYW5fYW5zd2VyX2NvcnJlY3QpKQpjdXJ2ZShkbm9ybSh4LG1lYW4oZGZfbWVhbnNfbzQkbWVhbl9hbnN3ZXJfY29ycmVjdCksc2QoZGZfbWVhbnNfbzQkbWVhbl9hbnN3ZXJfY29ycmVjdCkpLGx3ZD0yLGNvbD0iYmx1ZSIsYWRkPVRSVUUpCmNvbG9yTGlzdFJlc3VsdCAlPiUgZmlsdGVyKGNvbmRpdGlvbj09NixhZ2U9PSJvbGQiKSAtPiBkZl9tZWFuc19vNgpmcm9tVG8gPC0gcm91bmQocmFuZ2UoZGZfbWVhbnNfbzYkbWVhbl9hbnN3ZXJfY29ycmVjdCksMikrYygtMC4wOCwwLjA4KQpsaW1pdHMgPC0gc2VxKGZyb209ZnJvbVRvWzFdLCB0bz1mcm9tVG9bMl0sIGJ5PTAuMDIpCmhpc3QoZGZfbWVhbnNfbzYkbWVhbl9hbnN3ZXJfY29ycmVjdCxmcmVxPUZBTFNFLHhsaW0gPSBmcm9tVG8gLHhsYWIgPSAiTWl0dGVsd2VydCBrb3JyZWt0ZSBBbnR3b3J0ZW4iLHlsYWIgPSAicmVsYXRpdmUgSMOkdWZpZ2tlaXQiLGJyZWFrcz1saW1pdHMsbWFpbiA9ICJIaXN0b2dyYW1tICYgTm9ybWFsdmVydGVpbHVuZyBmw7xyIE9sZCwgU2V0c2l6ZSA2IikKcnVnKGppdHRlcihkZl9tZWFuc19vNiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSkKY3VydmUoZG5vcm0oeCxtZWFuKGRmX21lYW5zX282JG1lYW5fYW5zd2VyX2NvcnJlY3QpLHNkKGRmX21lYW5zX282JG1lYW5fYW5zd2VyX2NvcnJlY3QpKSxsd2Q9Mixjb2w9ImJsdWUiLGFkZD1UUlVFKQpjb2xvckxpc3RSZXN1bHQgJT4lIGZpbHRlcihjb25kaXRpb249PTgsYWdlPT0ib2xkIikgLT4gZGZfbWVhbnNfbzgKZnJvbVRvIDwtIHJvdW5kKHJhbmdlKGRmX21lYW5zX284JG1lYW5fYW5zd2VyX2NvcnJlY3QpLDIpK2MoLTAuMDgsMC4wOCkKbGltaXRzIDwtIHNlcShmcm9tPWZyb21Ub1sxXSwgdG89ZnJvbVRvWzJdLCBieT0wLjAyKQpoaXN0KGRmX21lYW5zX284JG1lYW5fYW5zd2VyX2NvcnJlY3QsZnJlcT1GQUxTRSx4bGltID0gZnJvbVRvICx4bGFiID0gIk1pdHRlbHdlcnQga29ycmVrdGUgQW50d29ydGVuIix5bGFiID0gInJlbGF0aXZlIEjDpHVmaWdrZWl0IixicmVha3M9bGltaXRzLG1haW4gPSAiSGlzdG9ncmFtbSAmIE5vcm1hbHZlcnRlaWx1bmcgZsO8ciBPbGQsIFNldHNpemUgOCIpCnJ1ZyhqaXR0ZXIoZGZfbWVhbnNfbzgkbWVhbl9hbnN3ZXJfY29ycmVjdCkpCmN1cnZlKGRub3JtKHgsbWVhbihkZl9tZWFuc19vOCRtZWFuX2Fuc3dlcl9jb3JyZWN0KSxzZChkZl9tZWFuc19vOCRtZWFuX2Fuc3dlcl9jb3JyZWN0KSksbHdkPTIsY29sPSJibHVlIixhZGQ9VFJVRSkKY29sb3JMaXN0UmVzdWx0ICU+JSBmaWx0ZXIoY29uZGl0aW9uPT0yLGFnZT09InlvdW5nIikgLT4gZGZfbWVhbnNfeTIKZnJvbVRvIDwtIHJvdW5kKHJhbmdlKGRmX21lYW5zX3kyJG1lYW5fYW5zd2VyX2NvcnJlY3QpLDIpK2MoLTAuMDgsMC4wOCkKbGltaXRzIDwtIHNlcShmcm9tPWZyb21Ub1sxXSwgdG89ZnJvbVRvWzJdLCBieT0wLjAyKQpoaXN0KGRmX21lYW5zX3kyJG1lYW5fYW5zd2VyX2NvcnJlY3QsZnJlcT1GQUxTRSx4bGltID0gZnJvbVRvICx4bGFiID0gIk1pdHRlbHdlcnQga29ycmVrdGUgQW50d29ydGVuIix5bGFiID0gInJlbGF0aXZlIEjDpHVmaWdrZWl0IixicmVha3M9bGltaXRzLG1haW4gPSAiSGlzdG9ncmFtbSAmIE5vcm1hbHZlcnRlaWx1bmcgZsO8ciBZb3VuZywgU2V0c2l6ZSAyIikKcnVnKGppdHRlcihkZl9tZWFuc195MiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSkKY3VydmUoZG5vcm0oeCxtZWFuKGRmX21lYW5zX3kyJG1lYW5fYW5zd2VyX2NvcnJlY3QpLHNkKGRmX21lYW5zX3kyJG1lYW5fYW5zd2VyX2NvcnJlY3QpKSxsd2Q9Mixjb2w9ImJsdWUiLGFkZD1UUlVFKQpjb2xvckxpc3RSZXN1bHQgJT4lIGZpbHRlcihjb25kaXRpb249PTQsYWdlPT0ieW91bmciKSAtPiBkZl9tZWFuc195NApmcm9tVG8gPC0gcm91bmQocmFuZ2UoZGZfbWVhbnNfeTQkbWVhbl9hbnN3ZXJfY29ycmVjdCksMikrYygtMC4wOCwwLjA4KQpsaW1pdHMgPC0gc2VxKGZyb209ZnJvbVRvWzFdLCB0bz1mcm9tVG9bMl0sIGJ5PTAuMDIpCmhpc3QoZGZfbWVhbnNfeTQkbWVhbl9hbnN3ZXJfY29ycmVjdCxmcmVxPUZBTFNFLHhsaW0gPSBmcm9tVG8gLHhsYWIgPSAiTWl0dGVsd2VydCBrb3JyZWt0ZSBBbnR3b3J0ZW4iLHlsYWIgPSAicmVsYXRpdmUgSMOkdWZpZ2tlaXQiLGJyZWFrcz1saW1pdHMsbWFpbiA9ICJIaXN0b2dyYW1tICYgTm9ybWFsdmVydGVpbHVuZyBmw7xyIFlvdW5nLCBTZXRzaXplIDQiKQpydWcoaml0dGVyKGRmX21lYW5zX3k0JG1lYW5fYW5zd2VyX2NvcnJlY3QpKQpjdXJ2ZShkbm9ybSh4LG1lYW4oZGZfbWVhbnNfeTQkbWVhbl9hbnN3ZXJfY29ycmVjdCksc2QoZGZfbWVhbnNfeTQkbWVhbl9hbnN3ZXJfY29ycmVjdCkpLGx3ZD0yLGNvbD0iYmx1ZSIsYWRkPVRSVUUpCmNvbG9yTGlzdFJlc3VsdCAlPiUgZmlsdGVyKGNvbmRpdGlvbj09NixhZ2U9PSJ5b3VuZyIpIC0+IGRmX21lYW5zX3k2CmZyb21UbyA8LSByb3VuZChyYW5nZShkZl9tZWFuc195NiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSwyKStjKC0wLjA4LDAuMDgpCmxpbWl0cyA8LSBzZXEoZnJvbT1mcm9tVG9bMV0sIHRvPWZyb21Ub1syXSwgYnk9MC4wMikKaGlzdChkZl9tZWFuc195NiRtZWFuX2Fuc3dlcl9jb3JyZWN0LGZyZXE9RkFMU0UseGxpbSA9IGZyb21UbyAseGxhYiA9ICJNaXR0ZWx3ZXJ0IGtvcnJla3RlIEFudHdvcnRlbiIseWxhYiA9ICJyZWxhdGl2ZSBIw6R1Zmlna2VpdCIsYnJlYWtzPWxpbWl0cyxtYWluID0gIkhpc3RvZ3JhbW0gJiBOb3JtYWx2ZXJ0ZWlsdW5nIGbDvHIgWW91bmcsIFNldHNpemUgNiIpCnJ1ZyhqaXR0ZXIoZGZfbWVhbnNfeTYkbWVhbl9hbnN3ZXJfY29ycmVjdCkpCmN1cnZlKGRub3JtKHgsbWVhbihkZl9tZWFuc195NiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSxzZChkZl9tZWFuc195NiRtZWFuX2Fuc3dlcl9jb3JyZWN0KSksbHdkPTIsY29sPSJibHVlIixhZGQ9VFJVRSkKY29sb3JMaXN0UmVzdWx0ICU+JSBmaWx0ZXIoY29uZGl0aW9uPT04LGFnZT09InlvdW5nIikgLT4gZGZfbWVhbnNfeTgKZnJvbVRvIDwtIHJvdW5kKHJhbmdlKGRmX21lYW5zX284JG1lYW5fYW5zd2VyX2NvcnJlY3QpLDIpK2MoLTAuMDgsMC4wOCkKbGltaXRzIDwtIHNlcShmcm9tPWZyb21Ub1sxXSwgdG89ZnJvbVRvWzJdLCBieT0wLjAyKQpoaXN0KGRmX21lYW5zX3k4JG1lYW5fYW5zd2VyX2NvcnJlY3QsZnJlcT1GQUxTRSx4bGltID0gZnJvbVRvICx4bGFiID0gIk1pdHRlbHdlcnQga29ycmVrdGUgQW50d29ydGVuIix5bGFiID0gInJlbGF0aXZlIEjDpHVmaWdrZWl0IixicmVha3M9bGltaXRzLG1haW4gPSAiSGlzdG9ncmFtbSAmIE5vcm1hbHZlcnRlaWx1bmcgZsO8ciBZb3VuZywgU2V0c2l6ZSA4IikKcnVnKGppdHRlcihkZl9tZWFuc195OCRtZWFuX2Fuc3dlcl9jb3JyZWN0KSkKY3VydmUoZG5vcm0oeCxtZWFuKGRmX21lYW5zX3k4JG1lYW5fYW5zd2VyX2NvcnJlY3QpLHNkKGRmX21lYW5zX3k4JG1lYW5fYW5zd2VyX2NvcnJlY3QpKSxsd2Q9Mixjb2w9ImJsdWUiLGFkZD1UUlVFKQoKYGBgCksgV2VydApgYGB7cn0KIyBDb2xvciBMaXN0CmNvbG9yTGlzdFJlc3VsdCAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShhZ2UsY29uZGl0aW9uKSAlPiVzdW1tYXJpc2Uocm91bmQobWVhbihoaXRSYXRlKSwyKSxyb3VuZChzZChoaXRSYXRlKSwyKSxyb3VuZChtZWFuKGZhbHNlQWxhcm1SYXRlKSwyKSxyb3VuZChzZChmYWxzZUFsYXJtUmF0ZSksMikscm91bmQobWVhbihrKSwyKSxyb3VuZChzZChrKSwyKSxyb3VuZChtZWFuKGtQYXNobGVyKSwyKSxyb3VuZChzZChrUGFzaGxlciksMikpIC0+ZGZfS1N0YXRfZGF0YQpuYW1lcyhkZl9LU3RhdF9kYXRhKSA8LSBjKCJhZ2UiLCJzZXRzaXplIiwibWVhbl9oaXRfcmF0ZSIsInNkX2hpdF9yYXRlIiwibWVhbl9mYWxzZV9hbGFybSIsInNkX2ZhbHNlX2FsYXJtIiwibWVhbl9rIiwic2RfayIsIm1lYW5fa1Bhc2hsZXIiLCJzZF9rUGFzaGxlciIpCmNvbG9yTGlzdFJlc3VsdCAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShhZ2UsY29uZGl0aW9uKSAlPiVzdW1tYXJpc2UocGFzdGUocm91bmQobWVhbihoaXRSYXRlKSwyKSwiLyIscm91bmQoc2QoaGl0UmF0ZSksMikpLHBhc3RlKHJvdW5kKG1lYW4oZmFsc2VBbGFybVJhdGUpLDIpLCIvIixyb3VuZChzZChmYWxzZUFsYXJtUmF0ZSksMikpLHBhc3RlKHJvdW5kKG1lYW4oayksMiksIi8iLHJvdW5kKHNkKGspLDIpKSxwYXN0ZShyb3VuZChtZWFuKGtQYXNobGVyKSwyKSwiLyIscm91bmQoc2Qoa1Bhc2hsZXIpLDIpKSkgLT5kZl9LU3RhdApuYW1lcyhkZl9LU3RhdCkgPC0gYygiYWdlIiwiU2V0IFNpemUiLCJIaXRSYXRlIE1lYW4vU0QiLCJGYWxzZSBBbGFybSBNZWFuL1NEIiwiayBNZWFuIChTRCkiLCJrUGFzaGxlciBNRUFOL1NEIikKZGZfS1N0YXQgJT4lIGthYmxlKGNhcHRpb24gPSAiw5xiZXJibGljayBWZXJzdWNoc3JlaWhlIENvbG9yIG9iamVjdHMgSyIsYWxpZ24gPSAibGNjY2NjciIpCiMgT2JqZWN0IExpc3QKb2JqZWN0UmVzdWx0ICU+JSB1bmdyb3VwKCkgJT4lIGdyb3VwX2J5KGFnZSxzZXRzaXplKSAlPiVzdW1tYXJpc2Uocm91bmQobWVhbihoaXRSYXRlKSwyKSxyb3VuZChzZChoaXRSYXRlKSwyKSxyb3VuZChtZWFuKGZhbHNlQWxhcm1SYXRlKSwyKSxyb3VuZChzZChmYWxzZUFsYXJtUmF0ZSksMikscm91bmQobWVhbihrKSwyKSxyb3VuZChzZChrKSwyKSxyb3VuZChtZWFuKGtQYXNobGVyKSwyKSxyb3VuZChzZChrUGFzaGxlciksMikpIC0+ZGZfT19LU3RhdF9kYXRhCm5hbWVzKGRmX09fS1N0YXRfZGF0YSkgPC0gYygiYWdlIiwic2V0c2l6ZSIsIm1lYW5faGl0X3JhdGUiLCJzZF9oaXRfcmF0ZSIsIm1lYW5fZmFsc2VfYWxhcm0iLCJzZF9mYWxzZV9hbGFybSIsIm1lYW5fayIsInNkX2siLCJtZWFuX2tQYXNobGVyIiwic2Rfa1Bhc2hsZXIiKQpvYmplY3RSZXN1bHQgJT4lIHVuZ3JvdXAoKSAlPiUgZ3JvdXBfYnkoYWdlLHNldHNpemUpICU+JXN1bW1hcmlzZShwYXN0ZShyb3VuZChtZWFuKGhpdFJhdGUpLDIpLCIvIixyb3VuZChzZChoaXRSYXRlKSwyKSkscGFzdGUocm91bmQobWVhbihmYWxzZUFsYXJtUmF0ZSksMiksIi8iLHJvdW5kKHNkKGZhbHNlQWxhcm1SYXRlKSwyKSkscGFzdGUocm91bmQobWVhbihrKSwyKSwiLyIscm91bmQoc2QoayksMikpLHBhc3RlKHJvdW5kKG1lYW4oa1Bhc2hsZXIpLDIpLCIvIixyb3VuZChzZChrUGFzaGxlciksMikpKSAtPmRmX09fS1N0YXQKbmFtZXMoZGZfT19LU3RhdCkgPC0gYygiYWdlIiwiU2V0IFNpemUiLCJIaXRSYXRlIE1lYW4vU0QiLCJGYWxzZSBBbGFybSBNZWFuL1NEIiwiayBNZWFuIChTRCkiLCJrUGFzaGxlciBNRUFOL1NEIikKZGZfT19LU3RhdCAlPiUga2FibGUoY2FwdGlvbiA9ICLDnGJlcmJsaWNrIFZlcnN1Y2hzcmVpaGUgUmVhbCBXb3JsZCBPYmplY3RzIEsiLGFsaWduID0gImxjY2NjY3IiKQoKI2NvbG9yTGlzdFJlc3VsdCAlPiUgdW5ncm91cCAlPiUgZ3JvdXBfYnkoYWdlLGNvbmRpdGlvbikgJT4lIHN1bW1hcmlzZShyb3VuZChtYXgoayksMikpICU+JSBrYWJsZShjYXB0aW9uID0gIsOcYmVyYmxpY2sgVmVyc3VjaHNyZWloZSBDb2xvcnMgayBXZXJ0IixhbGlnbiA9ICJsY3IiKQojY29sb3JMaXN0UmVzdWx0ICU+JSB1bmdyb3VwICU+JSBncm91cF9ieShhZ2UsY29uZGl0aW9uKSAlPiUgc3VtbWFyaXNlKHJvdW5kKG1heChrUGFzaGxlciksMikpICU+JSBrYWJsZShjYXB0aW9uID0gIsOcYmVyYmxpY2sgVmVyc3VjaHNyZWloZSBDb2xvcnMga1Bhc2hsZXIgV2VydCIsYWxpZ24gPSAibGNyIikKI29iamVjdFJlc3VsdCAlPiUgdW5ncm91cCAlPiUgZ3JvdXBfYnkoYWdlLHNldHNpemUpICU+JSBzdW1tYXJpc2Uocm91bmQobWF4KGspLDIpKSAlPiUga2FibGUoY2FwdGlvbiA9ICLDnGJlcmJsaWNrIFZlcnN1Y2hzcmVpaGUgUmVhbCB3b3JsZCBvYmplY3RzIGsgV2VydCIsYWxpZ24gPSAibGNyIikKI29iamVjdFJlc3VsdCAlPiUgdW5ncm91cCAlPiUgZ3JvdXBfYnkoYWdlLHNldHNpemUpICU+JSBzdW1tYXJpc2Uocm91bmQobWF4KGtQYXNobGVyKSwyKSkgJT4lIGthYmxlKGNhcHRpb24gPSAiw5xiZXJibGljayBWZXJzdWNoc3JlaWhlIFJlYWwgd29ybGQgb2JqZWN0cyBrUGFzaGxlciBXZXJ0IixhbGlnbiA9ICJsY3IiKQoKZ2dwbG90KGRmX0tTdGF0X2RhdGEsIGFlcyh4PWZhY3RvcihzZXRzaXplKSwgeT1tZWFuX2ssIGZpbGw9ZmFjdG9yKGFnZSkpKSArIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5Iixjb2xvdXI9ImJsYWNrIixzaXplPS4zKSArZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1tZWFuX2stc2RfaywgeW1heD1tZWFuX2src2Rfayksc2l6ZT0uMyx3aWR0aD0uMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpK3hsYWIoIlNldCBTaXplIikgK3lsYWIoIk1lYW4gKGspIikgKyBzY2FsZV9maWxsX2h1ZShuYW1lPSJBZ2UgR3JvdXAiKSArIGdndGl0bGUoIkNvbG9yIFRlc3QgSyB2YWx1ZSByZXN1bHRzIHBlciBzZXQgc2l6ZSIpCgpnZ3Bsb3QoZGZfT19LU3RhdF9kYXRhLCBhZXMoeD1mYWN0b3Ioc2V0c2l6ZSksIHk9bWVhbl9rLCBmaWxsPWZhY3RvcihhZ2UpKSkgKyBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsY29sb3VyPSJibGFjayIsc2l6ZT0uMykgK2dlb21fZXJyb3JiYXIoYWVzKHltaW49bWVhbl9rLXNkX2ssIHltYXg9bWVhbl9rK3NkX2spLHNpemU9LjMsd2lkdGg9LjIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSt4bGFiKCJTZXQgU2l6ZSIpICt5bGFiKCJNZWFuIChrKSIpICsgc2NhbGVfZmlsbF9odWUobmFtZT0iQWdlIEdyb3VwIikgKyBnZ3RpdGxlKCJSZWFsIFdvcmxkIE9iamVjdHMgVGVzdCBLIHZhbHVlIHJlc3VsdHMgcGVyIHNldCBzaXplIikKCmdncGxvdChkZl9LU3RhdF9kYXRhLCBhZXMoeD1mYWN0b3Ioc2V0c2l6ZSksIHk9bWVhbl9rUGFzaGxlciwgZmlsbD1mYWN0b3IoYWdlKSkpICsgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLGNvbG91cj0iYmxhY2siLHNpemU9LjMpICtnZW9tX2Vycm9yYmFyKGFlcyh5bWluPW1lYW5fa1Bhc2hsZXItc2Rfa1Bhc2hsZXIsIHltYXg9bWVhbl9rUGFzaGxlcitzZF9rUGFzaGxlciksc2l6ZT0uMyx3aWR0aD0uMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpK3hsYWIoIlNldCBTaXplIikgK3lsYWIoIk1lYW4gKGstUGFzaGxlcikiKSArIHNjYWxlX2ZpbGxfaHVlKG5hbWU9IkFnZSBHcm91cCIpICsgZ2d0aXRsZSgiQ29sb3IgVGVzdCBrLVBhc2hsZXIgdmFsdWUgcmVzdWx0cyBwZXIgc2V0IHNpemUiKQoKZ2dwbG90KGRmX09fS1N0YXRfZGF0YSwgYWVzKHg9ZmFjdG9yKHNldHNpemUpLCB5PW1lYW5fa1Bhc2hsZXIsIGZpbGw9ZmFjdG9yKGFnZSkpKSArIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5Iixjb2xvdXI9ImJsYWNrIixzaXplPS4zKSArZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1tZWFuX2tQYXNobGVyLXNkX2tQYXNobGVyLCB5bWF4PW1lYW5fa1Bhc2hsZXIrc2Rfa1Bhc2hsZXIpLHNpemU9LjMsd2lkdGg9LjIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSt4bGFiKCJTZXQgU2l6ZSIpICt5bGFiKCJNZWFuIChrLVBhc2hsZXIpIikgKyBzY2FsZV9maWxsX2h1ZShuYW1lPSJBZ2UgR3JvdXAiKSArIGdndGl0bGUoIlJlYWwgV29ybGQgT2JqZWN0cyBUZXN0IGstUGFzaGxlciB2YWx1ZSByZXN1bHRzIHBlciBzZXQgc2l6ZSIpCgpgYGAKR3JhZmlrZW4gRsO8ciBLLVdlcnRlCgpgYGB7cn0KY29sb3JMaXN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PWssZmlsbD1hZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK2xhYnModGl0bGU9IkNvbG9ycyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGsiLCB4PSJhZ2UiLCB5PSJtZWFuIGsiLCBmaWxsPSJBbnN3ZXIiKQoKb2JqZWN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PWssZmlsbD1hZ2UpKSArIGdlb21fdmlvbGluKCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK2xhYnModGl0bGU9IlJlYWwgd29ybGQgb2JqZWN0cyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGsiLCB4PSJhZ2UiLCB5PSJtZWFuIGsiLCBmaWxsPSJBbnN3ZXIiKQoKY29sb3JMaXN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PWssZmlsbD1hZ2UpKSsgZ2VvbV92aW9saW4oKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikrZmFjZXRfd3JhcCgufmNvbmRpdGlvbixzY2FsZXMgPSAnZnJlZScpK2xhYnModGl0bGU9IkNvbG9ycyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGsiLCB4PSJhZ2UiLCB5PSJtZWFuIGsiLCBmaWxsPSJBbnN3ZXIiKQoKb2JqZWN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PWssZmlsbD1hZ2UpKSsgZ2VvbV92aW9saW4oKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikrZmFjZXRfd3JhcCgufnNldHNpemUsc2NhbGVzID0gJ2ZyZWUnKStsYWJzKHRpdGxlPSJSZWFsIHdvcmxkIG9iamVjdHMiLHN1YnRpdGxlID0gImRpc3RyaWJ1dGlvbiB0ZXN0IHBlcnNvbnMgbWVhbiB2YWx1ZSBvZiBrIiwgeD0iYWdlIiwgeT0ibWVhbiBrIiwgZmlsbD0iQW5zd2VyIikKCmNvbG9yTGlzdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PWFnZSwgeT1rLGZpbGw9YWdlKSkgKyBnZW9tX2JveHBsb3QoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikrbGFicyh0aXRsZT0iQ29sb3JzIixzdWJ0aXRsZSA9ICJkaXN0cmlidXRpb24gdGVzdCBwZXJzb25zIG1lYW4gdmFsdWUgb2YgayIsIHg9ImFnZSIsIHk9Im1lYW4gayIsIGZpbGw9IkFuc3dlciIpCgpvYmplY3RSZXN1bHQgJT4lICBnZ3Bsb3QobWFwcGluZz1hZXMoeD1hZ2UsIHk9ayxmaWxsPWFnZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK2xhYnModGl0bGU9IlJlYWwgd29ybGQgb2JqZWN0cyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGsiLCB4PSJhZ2UiLCB5PSJtZWFuIGsiLCBmaWxsPSJBbnN3ZXIiKQoKY29sb3JMaXN0UmVzdWx0ICU+JSAgZ2dwbG90KG1hcHBpbmc9YWVzKHg9YWdlLCB5PWssZmlsbD1hZ2UpKSsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpK2ZhY2V0X3dyYXAoLn5jb25kaXRpb24sc2NhbGVzID0gJ2ZyZWUnKStsYWJzKHRpdGxlPSJDb2xvcnMiLHN1YnRpdGxlID0gImRpc3RyaWJ1dGlvbiB0ZXN0IHBlcnNvbnMgbWVhbiB2YWx1ZSBvZiBrIiwgeD0iYWdlIiwgeT0ibWVhbiBrIiwgZmlsbD0iQW5zd2VyIikKCm9iamVjdFJlc3VsdCAlPiUgIGdncGxvdChtYXBwaW5nPWFlcyh4PWFnZSwgeT1rLGZpbGw9YWdlKSkrIGdlb21fYm94cGxvdCgpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KStmYWNldF93cmFwKC5+c2V0c2l6ZSxzY2FsZXMgPSAnZnJlZScpK2xhYnModGl0bGU9IlJlYWwgd29ybGQgb2JqZWN0cyIsc3VidGl0bGUgPSAiZGlzdHJpYnV0aW9uIHRlc3QgcGVyc29ucyBtZWFuIHZhbHVlIG9mIGsiLCB4PSJhZ2UiLCB5PSJtZWFuIGsiLCBmaWxsPSJBbnN3ZXIiKQoKIyMjIyMjIyBLIEJhcmNoYXJ0cyAjIyMjIyMjIyMjCm1rQ2hhcnQgPC0gZ2dwbG90KGNvbG9yTGlzdFJlc3VsdCwgYWVzKHggPSBjb25kaXRpb24seSA9IGssIGNvbCA9IGZhY3RvcihhZ2UpLCBmaWxsID0gZmFjdG9yKGFnZSkpKQoKYGBgCgoKCgoKVW50ZXJzY2hpZWQgendpc2NoZW4gQ29sb3JzICYgT2JqZWt0ZQpIMTogw4RuZGVydW5nZW4gdm9uIFJlYWwgV29ybGQgT2JqZWt0ZW4gd2VyZGVuIHZvbiBqdW5nZW4gUGVyc29uZW4gYmVzc2VyIGVya2FubnQgYWxzIMOEbmRlcnVuZ2VuIHZvbiBGYXJiZW4uCkgxOiDDhG5kZXJ1bmdlbiB2b24gUmVhbCBXb3JsZCBPYmpla3RlbiB3ZXJkZW4gdm9uIGFsdGVuIFBlcnNvbmVuIGJlc3NlciBlcmthbm50IGFscyDDhG5kZXJ1bmdlbiB2b24gRmFyYmVuLgpOb3R3ZW5kaWdlIEF1c3dlcnR1bmdlbjoKVC1UZXN0IGFiaMOkbmdpZ2UgU3RpY2hwcm9iZSBqZSBhbHQgdW5kIGp1bmcKClZvcmF1c3NldHp1bmdlbjoKCkFiaMOkbmdpZ2UgVmFyaWFibGUgaXN0IGludGVydmFsbHNrYWxpZXJ0IC0gb2sKRXMgbGllZ2VuIHp3ZWkgdmVyYnVuZGVuZSBTdGljaHByb2JlbiB2b3IgYWJlciBkaWUgTWXDn3dlcnRwYWFyZSBzaW5kIHVuYWJow6RuZ2lnIC0gb2sKRGllIFVudGVyc2NoaWVkZSB6d2lzY2hlbiBkZW4gdmVyYnVuZGVuZW4gVGVzdHdlcnRlbiBzaW5kIGluIGRlciBHcnVuZGdlc2FtdGhlaXQgbm9ybWFsdmVydGVpbHQuCmBgYHtyfQpjb2xvckxpc3QgJT4lIGZpbHRlcihjb25kaXRpb24gPD0gNikgJT4lIHN1bW1hcmlzZShtZWFuKGFuc3dlcl9jb3JyZWN0KSkgLT4gZGZfbWVhbl9jb2xvcl9hbGwKCgpgYGAKCg==